{"record":{"id":"e3ea6714a1041951","repo":"flxzt/rnote","slug":"no-page-at-index-page-i","errorCode":null,"errorMessage":"no page at index '{page_i}","messagePattern":"no page at index '(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/rnote-engine/src/strokes/bitmapimage.rs","lineNumber":169,"sourceCode":"        } else {\n            format.width() * (pdf_import_prefs.page_width_perc / 100.0)\n        };\n\n        // calculate the page zoom based on the width of the first page.\n        let page_zoom = if let Some(first_page) = pages.first() {\n            page_width / first_page.render_dimensions().0 as f64\n        } else {\n            return Ok(vec![]);\n        };\n        let x = insert_pos[0];\n        let mut y = insert_pos[1];\n\n        // TODO: investigate if this can be parallelized with rayon's `par_iter()`\n        let pngs = page_range\n            .map(|page_i| {\n                let page = pages\n                    .get(page_i)\n                    .ok_or_else(|| anyhow::anyhow!(\"no page at index '{page_i}\"))?;\n                let (intrinsic_width, intrinsic_height) = {\n                    let dimensions = page.render_dimensions();\n                    (dimensions.0 as f64, dimensions.1 as f64)\n                };\n                let width = intrinsic_width * page_zoom;\n                let height = intrinsic_height * page_zoom;\n                let render_settings = hayro::RenderSettings {\n                    x_scale: (pdf_import_prefs.bitmap_scalefactor * page_zoom) as f32,\n                    y_scale: (pdf_import_prefs.bitmap_scalefactor * page_zoom) as f32,\n                    width: Some((pdf_import_prefs.bitmap_scalefactor * width).ceil() as u16),\n                    height: Some((pdf_import_prefs.bitmap_scalefactor * height).ceil() as u16),\n                    bg_color: vello_cpu::color::AlphaColor::WHITE,\n                };\n\n                // TODO: implement drawing page borders.\n                // Possibly with vello-cpu, since it already is a dependency of hayro\n                let pixmap = hayro::render(page, &interpreter_settings, &render_settings);\n                let png_data = pixmap.into_png()?;","sourceCodeStart":151,"sourceCodeEnd":187,"githubUrl":"https://github.com/flxzt/rnote/blob/bbc5354502ba2fc83eec2670b535348825e679a6/crates/rnote-engine/src/strokes/bitmapimage.rs#L151-L187","documentation":"Importing a PDF into an Image by rendering its pages to PNG. from_pdf_bytes takes a page range and looks each page up in the parsed PDF's page list; if an index in that range is not present, this error is thrown. It means the requested page index is out of bounds for the loaded document.","triggerScenarios":"Calling VectorImage::from_pdf_bytes (bitmapimage equivalent: Image::from_pdf_bytes with Pdf) with a page range like 0..10 on a PDF that has fewer pages, or using 1-based page numbers instead of 0-based indices.","commonSituations":"Users select 'pages 5-10' in an import dialog for a 4-page PDF; documents re-saved or truncated before import; off-by-one confusion between UI page numbers (1-based) and API indices (0-based).","solutions":["Clamp the page range to pages.len() before calling from_pdf_bytes","Convert 1-based UI page numbers to 0-based indices (subtract 1)","Parse the PDF first (e.g. hayro_syntax::Pdf::new) and validate page count before requesting pages","Return a user-facing 'page N does not exist' message with the actual page count"],"exampleFix":"// before\nlet pages = 0..10;\nimage::Image::from_pdf_bytes(bytes, pages, zoom, None)?;\n// after\nlet page_count = hayro_syntax::Pdf::new(bytes.into())?.pages().len();\nlet pages = 0..10.min(page_count as u32);\nimage::Image::from_pdf_bytes(bytes, pages, zoom, None)?;","handlingStrategy":"validation","validationCode":"let page_count = hayro_syntax::Pdf::new(bytes.clone().into())?.pages().len() as u32;\nassert!(page_range.start < page_count && page_range.end <= page_count, \"page range {page_range:?} exceeds {} pages\", page_count);","typeGuard":"fn page_range_in_bounds(range: std::ops::Range<u32>, page_count: usize) -> bool {\n    range.start < range.end && (range.end as usize) <= page_count\n}","tryCatchPattern":"match from_pdf_bytes(bytes, range, zoom, password) {\n    Ok(imgs) => imgs,\n    Err(e) if e.to_string().contains(\"no page at index\") => {\n        eprintln!(\"requested pages not in document, clamping to available pages\");\n        from_pdf_bytes(bytes, clamp_range(range, actual_count), zoom, password)?\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Always derive the page range from the parsed PDF's page count, never from user input directly","Convert 1-based UI page numbers to 0-based indices at the UI boundary","Clamp ranges with .min(page_count) before conversion","Surface the document's actual page count in import dialogs"],"tags":["pdf","page-index","out-of-bounds","import"],"backgroundTag":"index-out-of-range","analyzedSha":"bbc5354502ba2fc83eec2670b535348825e679a6","analyzedAt":"2026-09-08T13:20:33.747Z","contentChangedAt":"2026-09-08T13:20:33.747Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}