diff --git a/minipdf-rs/crates/minipdf/src/docx.rs b/minipdf-rs/crates/minipdf/src/docx.rs index ee014ed8..5a8aa2fe 100644 --- a/minipdf-rs/crates/minipdf/src/docx.rs +++ b/minipdf-rs/crates/minipdf/src/docx.rs @@ -679,9 +679,9 @@ fn read_paragraph( relationships: &HashMap, archive: &mut ZipArchive>, ) -> Result<()> { - if paragraph - .descendants() - .any(|node| node.has_tag_name("pageBreakBefore")) + if child(paragraph, "pPr") + .and_then(|properties| child(properties, "pageBreakBefore")) + .is_some_and(property_enabled) { blocks.push(DocxBlock::PageBreak); } @@ -2400,6 +2400,50 @@ mod tests { ); } + #[test] + fn ignores_disabled_page_break_before() { + let input = create_docx( + r#"FirstSecondThirdFourth"#, + ); + + let document = read_docx_document(&input).unwrap(); + + assert_eq!( + document.blocks, + vec![ + DocxBlock::Paragraph(plain_paragraph("First".to_owned())), + DocxBlock::Paragraph(plain_paragraph("Second".to_owned())), + DocxBlock::Paragraph(plain_paragraph("Third".to_owned())), + DocxBlock::PageBreak, + DocxBlock::Paragraph(plain_paragraph("Fourth".to_owned())), + ] + ); + let pdf = convert_docx_bytes(&input, &ConversionOptions::default()).unwrap(); + assert_eq!( + pdf.windows(b"/Type /Page /Parent".len()) + .filter(|chunk| *chunk == b"/Type /Page /Parent") + .count(), + 2 + ); + } + + #[test] + fn ignores_page_break_before_in_change_history() { + let input = create_docx( + r#"FirstSecond"#, + ); + + let document = read_docx_document(&input).unwrap(); + + assert_eq!( + document.blocks, + vec![ + DocxBlock::Paragraph(plain_paragraph("First".to_owned())), + DocxBlock::Paragraph(plain_paragraph("Second".to_owned())), + ] + ); + } + #[test] fn reads_and_renders_basic_table() { let input = create_docx(