diff --git a/src/Document/Object/Decorator/Font.php b/src/Document/Object/Decorator/Font.php index 59f06c25..dc51f723 100644 --- a/src/Document/Object/Decorator/Font.php +++ b/src/Document/Object/Decorator/Font.php @@ -2,6 +2,7 @@ namespace PrinsFrank\PdfParser\Document\Object\Decorator; +use PrinsFrank\MarkDownDom\Enum\HeadingLevel; use PrinsFrank\PdfParser\Document\CMap\Registry\RegistryOrchestrator; use PrinsFrank\PdfParser\Document\CMap\ToUnicode\ToUnicodeCMap; use PrinsFrank\PdfParser\Document\CMap\ToUnicode\ToUnicodeCMapParser; @@ -312,4 +313,17 @@ public function isItalic(): bool { || str_contains($baseFont, 'oblique') || str_contains($baseFont, 'slanted'); } + + public function getHeadingLevel(TextState $textState, TransformationMatrix $transformationMatrix): ?HeadingLevel { + $effectiveFontSize = $textState->getFontSize() * $transformationMatrix->scaleX; + + return match (true) { + $effectiveFontSize >= 30 => HeadingLevel::Level1, + $effectiveFontSize >= 26 => HeadingLevel::Level2, + $effectiveFontSize >= 22 => HeadingLevel::Level3, + $effectiveFontSize >= 18 => HeadingLevel::Level4, + $effectiveFontSize >= 14 => HeadingLevel::Level5, + default => null, + }; + } } diff --git a/src/Extraction/Markdown/MarkdownExtractor.php b/src/Extraction/Markdown/MarkdownExtractor.php index 65a703b3..d230c948 100644 --- a/src/Extraction/Markdown/MarkdownExtractor.php +++ b/src/Extraction/Markdown/MarkdownExtractor.php @@ -2,8 +2,11 @@ namespace PrinsFrank\PdfParser\Extraction\Markdown; +use PrinsFrank\MarkDownDom\Contract\BlockNode; use PrinsFrank\MarkDownDom\Contract\InlineNode; use PrinsFrank\MarkDownDom\Document; +use PrinsFrank\MarkDownDom\Enum\HeadingLevel; +use PrinsFrank\MarkDownDom\Node\Block\Heading; use PrinsFrank\MarkDownDom\Node\Block\Paragraph; use PrinsFrank\MarkDownDom\Node\Inline\Bold; use PrinsFrank\MarkDownDom\Node\Inline\Italic; @@ -21,14 +24,20 @@ class MarkdownExtractor { public static function extractContent(array $positionedTextElements, Page $page): Document { $lineGroupedElements = TextOverlapStrategy::group($positionedTextElements); - $lineNodes = []; + $blockNodes = $inLineNodes = []; $textBuffer = ''; $previousElementIsBold = $previousElementIsItalic = false; + $previousHeadingLevel = null; foreach ($lineGroupedElements as $i => $positionedTextElementsForLine) { if ($i !== 0) { - if ($previousElementIsBold || $previousElementIsItalic) { - self::flushNodes($lineNodes, $textBuffer, $previousElementIsBold, $previousElementIsItalic); - $lineNodes[] = new Text("\n"); + if ($previousHeadingLevel !== null) { + self::flushInLineNodes($inLineNodes, $textBuffer, $previousElementIsBold, $previousElementIsItalic); + self::flushBlockNodes($blockNodes, $inLineNodes, $previousHeadingLevel); + $previousHeadingLevel = null; + } elseif ($previousElementIsBold || $previousElementIsItalic) { + self::flushInLineNodes($inLineNodes, $textBuffer, $previousElementIsBold, $previousElementIsItalic); + $inLineNodes[] = new Text("\n"); + $previousElementIsItalic = $previousElementIsBold = false; } else { $textBuffer .= "\n"; } @@ -44,9 +53,12 @@ public static function extractContent(array $positionedTextElements, Page $page) } $font = $positionedTextElement->getFont($page); - if ($font->isBold() !== $previousElementIsBold - || $font->isItalic() !== $previousElementIsItalic) { - self::flushNodes($lineNodes, $textBuffer, $previousElementIsBold, $previousElementIsItalic); + $currentHeadingLevel = $font->getHeadingLevel($positionedTextElement->textState, $positionedTextElement->absoluteMatrix); + if ($previousHeadingLevel !== $currentHeadingLevel) { + self::flushInLineNodes($inLineNodes, $textBuffer, $previousElementIsBold, $previousElementIsItalic); + self::flushBlockNodes($blockNodes, $inLineNodes, $previousHeadingLevel); + } elseif ($font->isBold() !== $previousElementIsBold || $font->isItalic() !== $previousElementIsItalic) { + self::flushInLineNodes($inLineNodes, $textBuffer, $previousElementIsBold, $previousElementIsItalic); } if ($previousTextElementOnLine !== null) { @@ -72,17 +84,33 @@ public static function extractContent(array $positionedTextElements, Page $page) $previousTextElementEndsWithSpace = str_ends_with($elementText, ' '); $previousElementIsItalic = $font->isItalic(); $previousElementIsBold = $font->isBold(); + $previousHeadingLevel = $currentHeadingLevel; $textBuffer .= $elementText; } } - self::flushNodes($lineNodes, $textBuffer, $previousElementIsBold, $previousElementIsItalic); + self::flushInLineNodes($inLineNodes, $textBuffer, $previousElementIsBold, $previousElementIsItalic); + self::flushBlockNodes($blockNodes, $inLineNodes, $previousHeadingLevel); - return new Document(new Paragraph(...$lineNodes)); + return new Document(...$blockNodes); } - /** @param list $lineNodes */ - private static function flushNodes(array &$lineNodes, string &$textBuffer, bool $previousElementIsBold, bool $previousElementIsItalic): void { + /** + * @param list $blockNodes + * @param list $inLineNodes + */ + private static function flushBlockNodes(array &$blockNodes, array &$inLineNodes, ?HeadingLevel $previousHeadingLevel): void { + if ($previousHeadingLevel === null) { + $blockNodes[] = new Paragraph(...$inLineNodes); + } else { + $blockNodes[] = new Heading($previousHeadingLevel, ...$inLineNodes); + } + + $inLineNodes = []; + } + + /** @param list $inLineNodes */ + private static function flushInLineNodes(array &$inLineNodes, string &$textBuffer, bool $previousElementIsBold, bool $previousElementIsItalic): void { if ($textBuffer === '') { return; } @@ -90,7 +118,7 @@ private static function flushNodes(array &$lineNodes, string &$textBuffer, bool $trailingWhitespace = null; if ($previousElementIsBold || $previousElementIsItalic) { if (str_starts_with($textBuffer, ' ')) { - $lineNodes[] = new Text(substr($textBuffer, 0, strlen($textBuffer) - strlen(ltrim($textBuffer)))); + $inLineNodes[] = new Text(substr($textBuffer, 0, strlen($textBuffer) - strlen(ltrim($textBuffer)))); $textBuffer = ltrim($textBuffer); } if (str_ends_with($textBuffer, ' ')) { @@ -99,18 +127,18 @@ private static function flushNodes(array &$lineNodes, string &$textBuffer, bool } } - $lineNode = new Text($textBuffer); + $inLineNode = new Text($textBuffer); if ($previousElementIsBold) { - $lineNode = new Bold($lineNode); + $inLineNode = new Bold($inLineNode); } if ($previousElementIsItalic) { - $lineNode = new Italic($lineNode); + $inLineNode = new Italic($inLineNode); } - $lineNodes[] = $lineNode; + $inLineNodes[] = $inLineNode; if ($trailingWhitespace !== null) { - $lineNodes[] = $trailingWhitespace; + $inLineNodes[] = $trailingWhitespace; } $textBuffer = ''; } diff --git a/tests/Samples/files/gdocs-lorem-ipsum-with-titles-and-formatting/contents.yml b/tests/Samples/files/gdocs-lorem-ipsum-with-titles-and-formatting/contents.yml index c0f5ea52..91a20182 100644 --- a/tests/Samples/files/gdocs-lorem-ipsum-with-titles-and-formatting/contents.yml +++ b/tests/Samples/files/gdocs-lorem-ipsum-with-titles-and-formatting/contents.yml @@ -45,13 +45,17 @@ pages: eos doloribus autem vel accusamus sequi et quidem reiciendis. ● Ut autem excepturi ut sequi laboriosam est quas debitis et placeat consequatur! markdown: |- - **Nam quod molestias vel corporis** - **aperiam.** + ### **Nam quod molestias vel corporis** + + ### **aperiam.** + Lorem ipsum dolor sit amet. Et omnis perferendis *Et quisquam qui laboriosam explicabo et* *natus corrupti* aut repudiandae iure quo inventore itaque et odio atque. Qui necessitatibus odit et commodi accusamus**Et fuga**! - **Qui distinctio praesentium sed corporis reiciendis eum** - **molestiae eius.** + ##### **Qui distinctio praesentium sed corporis reiciendis eum** + + ##### **molestiae eius.** + Qui aperiam aspernatur rem consectetur ullamest quod qui architecto corporis et repellendus expedita! Ex fuga ducimus *Ea ipsam et nobis architecto sed ratione deserunt* et iure sapiente qui animi Quis. Cum quod facilis eos exercitationem quam Est ullam est diff --git a/tests/Samples/files/issue-152/contents.yml b/tests/Samples/files/issue-152/contents.yml index e68401c3..336f713f 100644 --- a/tests/Samples/files/issue-152/contents.yml +++ b/tests/Samples/files/issue-152/contents.yml @@ -48,7 +48,8 @@ pages: NET A PAYER4 395,24EUR SIRET : 43521016600011 - APE : 4634Z - TVA IntraCom : FR34435210166 - N° ACCISES : FR001513E0173 markdown: |- - **BERTOSSI & RAYNAL** + ### **BERTOSSI & RAYNAL** + **Commande N° CF_007859** SARL BERTOSSI-RAYNAL - PLAISIRS DU VIN Allée de Riols - ZAC Agen Sud diff --git a/tests/Samples/files/issue-214/contents.yml b/tests/Samples/files/issue-214/contents.yml index 47139a0e..4874e098 100644 --- a/tests/Samples/files/issue-214/contents.yml +++ b/tests/Samples/files/issue-214/contents.yml @@ -28,11 +28,13 @@ pages: die Botschafterin von Barbados, Frau Nicolla Simone Rudder, zur Entgegennahme ihrer Beglaubigungsschreiben empfangen. markdown: |- - **Sonstiges** + ##### **Sonstiges** + Veröffentlicht am Dienstag, 16. September 2025 BAnz AT 16.09.2025 S1 Seite 1 von 1 - **Auswärtiges Amt** + ##### **Auswärtiges Amt** + Empfänge beim Bundespräsidenten Das Auswärtige Amt gibt bekannt: Der Bundespräsident hat am Mittwoch, dem 27. August 2025 diff --git a/tests/Samples/files/issue-215/contents.yml b/tests/Samples/files/issue-215/contents.yml index 1730861d..80ebc78d 100644 --- a/tests/Samples/files/issue-215/contents.yml +++ b/tests/Samples/files/issue-215/contents.yml @@ -12,7 +12,8 @@ modificationDate: 2025-09-01T16:24:09+02:00 pages: - text: |- - Deutscher Bundestag Drucksache 21/1407 + Deutscher Bundestag + Drucksache 21/1407 21. Wahlperiode 28.08.2025 Antwort der Bundesregierung @@ -57,9 +58,13 @@ pages: vom 28. August 2025 übermittelt. Die Drucksache enthält zusätzlich – in kleinerer Schrifttype – den Fragetext. markdown: |- - **Deutscher Bundestag Drucksache** 21/**1407** + ##### **Deutscher Bundestag** + + **Drucksache** ##### 21/**1407** + **21. Wahlperiode** 28.08.2025 - **Antwort** + ##### **Antwort** + **der Bundesregierung** **auf die Kleine Anfrage der Abgeordneten Jörg Cezanne, Desiree Becker, Violetta** **Bock, Clara Bünger, Anne-Mieke Bremer, Katrin Fey, Dr. Gregor Gysi, Luke Hoß,** diff --git a/tests/Samples/files/issue-235/contents.yml b/tests/Samples/files/issue-235/contents.yml index 78b41c3f..6bef0338 100644 --- a/tests/Samples/files/issue-235/contents.yml +++ b/tests/Samples/files/issue-235/contents.yml @@ -13,8 +13,10 @@ pages: - text: |- - Niedersächsisches - Gesetz- und Verordnungsblatt + Niedersächsisches + + Gesetz- und Verordnungsblatt + 79. Jahrgang Hannover, den 10. April 2025 Nummer 25 Verordnung @@ -49,9 +51,16 @@ pages: Herausgeber: Niedersächsische Staatskanzlei markdown: |2- **** - Niedersächsisches - Gesetz- und Verordnungsblatt - 79. Jahrgang Hannover, den 10. April 2025 Nummer 25 + #### Niedersächsisches + + ## + + ## Gesetz- und Verordnungsblatt + + # + + ##### 79. Jahrgang Hannover, den 10. April 2025 Nummer 25 + **Verordnung** **zur Änderung der Feuerwehrverordnung** diff --git a/tests/Samples/files/issue-254/contents.yml b/tests/Samples/files/issue-254/contents.yml index 918f13d2..1f555e0c 100644 --- a/tests/Samples/files/issue-254/contents.yml +++ b/tests/Samples/files/issue-254/contents.yml @@ -61,7 +61,8 @@ pages: 12.5.2021 DE Amtsblatt der Europäischen Union L 170/1 I (Gesetzgebungsakte) - VERORDNUNGEN + ##### VERORDNUNGEN + **VERORDNUNG (EU) 2021/695 DES EUROPÄISCHEN PARLAMENTS UND DES RATES** **vom 28. April 2021** **zur Einrichtung von „Horizont Europa“, dem Rahmenprogramm für Forschung und Innovation,** diff --git a/tests/Samples/files/issue-255/contents.yml b/tests/Samples/files/issue-255/contents.yml index 4f7beb5b..a141d313 100644 --- a/tests/Samples/files/issue-255/contents.yml +++ b/tests/Samples/files/issue-255/contents.yml @@ -68,12 +68,15 @@ pages: – spezialisierte Beratung und Verweisberatung in den Fällen von Insolvenz, Trauer und so weiter, – Rentenberatung zum Übergang am Ende des Berufslebens in die nachberufliche Phase. markdown: |- - **Bekanntmachung** + ##### **Bekanntmachung** + Veröffentlicht am Mittwoch, 1. Oktober 2025 BAnz AT 01.10.2025 B1 Seite 1 von 8 - **Bundesministerium** - **für Bildung, Familie, Senioren, Frauen und Jugend** + ##### **Bundesministerium** + + ##### **für Bildung, Familie, Senioren, Frauen und Jugend** + Förderrichtlinie „Zusammenhalt stärken – Menschen verbinden“ ESF Plus-Förderperiode 2021 bis 2027 @@ -189,7 +192,8 @@ pages: periode 2021 bis 2027 (BNBest-P-ESF-Bund) sowie den Besonderen Nebenbestimmungen für Zuwendungen zur Projektförderung an Gebietskörperschaften und Zusammenschlüsse von Gebietskörperschaften im Rahmen des markdown: |- - **Bekanntmachung** + ##### **Bekanntmachung** + Veröffentlicht am Mittwoch, 1. Oktober 2025 BAnz AT 01.10.2025 B1 Seite 2 von 8 @@ -310,7 +314,8 @@ pages: zweckentsprechende Verwendung der von ihm weitergeleiteten Mittel durch den/die Teilvorhabenpartner verantwort- lich. markdown: |- - **Bekanntmachung** + ##### **Bekanntmachung** + Veröffentlicht am Mittwoch, 1. Oktober 2025 BAnz AT 01.10.2025 B1 Seite 3 von 8 @@ -425,7 +430,8 @@ pages: aufbringen. Die Zuschusshöhe beträgt pro Vorhaben und Jahr mindestens 20 000 Euro und höchstens 150 000 Euro. markdown: |- - **Bekanntmachung** + ##### **Bekanntmachung** + Veröffentlicht am Mittwoch, 1. Oktober 2025 BAnz AT 01.10.2025 B1 Seite 4 von 8 @@ -546,7 +552,8 @@ pages: bindung mit Artikel 6 der Verordnung (EU) 2021/1057 die bereichsübergreifenden Grundsätze Gleichstellung der Geschlechter und der Antidiskriminierung unter Hinzunahme des Ziels der ökologischen Nachhaltigkeit integriert markdown: |- - **Bekanntmachung** + ##### **Bekanntmachung** + Veröffentlicht am Mittwoch, 1. Oktober 2025 BAnz AT 01.10.2025 B1 Seite 5 von 8 @@ -669,7 +676,8 @@ pages: gen. Um den geltenden Datenschutzvorschriften zu genügen, müssen die Vorgaben der Verwaltungsbehörde zur Erfüllung der Informationspflicht nach Artikel 14 der Datenschutz-Grundverordnung umgesetzt werden. markdown: |- - **Bekanntmachung** + ##### **Bekanntmachung** + Veröffentlicht am Mittwoch, 1. Oktober 2025 BAnz AT 01.10.2025 B1 Seite 6 von 8 @@ -790,7 +798,8 @@ pages: Verwaltungsvorschriften, soweit nicht in diesen Förderrichtlinien Abweichungen von den Allgemeinen Verwaltungs- vorschriften zugelassen worden sind. markdown: |- - **Bekanntmachung** + ##### **Bekanntmachung** + Veröffentlicht am Mittwoch, 1. Oktober 2025 BAnz AT 01.10.2025 B1 Seite 7 von 8 @@ -870,7 +879,8 @@ pages: Im Auftrag Beate Brinkmann markdown: |- - **Bekanntmachung** + ##### **Bekanntmachung** + Veröffentlicht am Mittwoch, 1. Oktober 2025 BAnz AT 01.10.2025 B1 Seite 8 von 8 diff --git a/tests/Samples/files/issue-272/contents.yml b/tests/Samples/files/issue-272/contents.yml index 85735a30..cf14a217 100644 --- a/tests/Samples/files/issue-272/contents.yml +++ b/tests/Samples/files/issue-272/contents.yml @@ -41,11 +41,13 @@ pages: Der Vorsitzende Prof. Hecken markdown: |- - **Bekanntmachung** + ##### **Bekanntmachung** + Veröffentlicht am Mittwoch, 8. Oktober 2025 BAnz AT 08.10.2025 B5 Seite 1 von 1 - **Bundesministerium für Gesundheit** + ##### **Bundesministerium für Gesundheit** + Bekanntmachung eines Beschlusses des Gemeinsamen Bundesausschusses über eine Änderung der MD-Qualitätskontroll-Richtlinie: diff --git a/tests/Samples/files/issue-290/contents.yml b/tests/Samples/files/issue-290/contents.yml index 9ef19d90..d89e610b 100644 --- a/tests/Samples/files/issue-290/contents.yml +++ b/tests/Samples/files/issue-290/contents.yml @@ -12,7 +12,8 @@ modificationDate: 2025-09-12T14:25:52+02:00 pages: - text: |- - Deutscher Bundestag Drucksache 21/1576 + Deutscher Bundestag + Drucksache 21/1576 21. Wahlperiode 10.09.2025 Antwort der Bundesregierung @@ -55,9 +56,13 @@ pages: vom 9. September 2025 übermittelt. Die Drucksache enthält zusätzlich – in kleinerer Schrifttype – den Fragetext. markdown: |- - **Deutscher Bundestag Drucksache** 21/**1576** + ##### **Deutscher Bundestag** + + **Drucksache** ##### 21/**1576** + **21. Wahlperiode** 10.09.2025 - **Antwort** + ##### **Antwort** + **der Bundesregierung** **auf die Kleine Anfrage der Abgeordneten Bodo Ramelow, Clara Bünger, Anne-** **Mieke Bremer, weiterer Abgeordneter und der Fraktion Die Linke** diff --git a/tests/Samples/files/issue-291/contents.yml b/tests/Samples/files/issue-291/contents.yml index 93609483..65d2cb49 100644 --- a/tests/Samples/files/issue-291/contents.yml +++ b/tests/Samples/files/issue-291/contents.yml @@ -59,8 +59,10 @@ pages: - - **PRESS RELEASE No 149/25** + ### + + ##### **PRESS RELEASE No 149/25** + **Luxembourg, 2 December 2025** Judgment of the Court in Case C-34/24 | Stichting Right to Consumer Justice and Stichting App Stores diff --git a/tests/Samples/files/issue-393/contents.yml b/tests/Samples/files/issue-393/contents.yml index 4fac5426..5afbbe15 100644 --- a/tests/Samples/files/issue-393/contents.yml +++ b/tests/Samples/files/issue-393/contents.yml @@ -22,12 +22,18 @@ pages: DIFFERENCES ARRAY AT WINANSI CONTROL POSITIONS, FORCING TOUNICODE LOOKUP. markdown: |- - HELLO PDF WORLD. - THIS PDF USES CUSTOM ENCODING. - VISIBLE TEXT IS WHAT YOU READ ABOVE. - NAIVE PARSERS THAT IGNORE THE - DIFFERENCES ARRAY AND TOUNICODE CMAP - WILL OUTPUT GARBAGE FOR EVERY LINE. + #### HELLO PDF WORLD. + + ##### THIS PDF USES CUSTOM ENCODING. + + ##### VISIBLE TEXT IS WHAT YOU READ ABOVE. + + ##### NAIVE PARSERS THAT IGNORE THE + + ##### DIFFERENCES ARRAY AND TOUNICODE CMAP + + ##### WILL OUTPUT GARBAGE FOR EVERY LINE. + EVERY VISIBLE CHARACTER MAPS THROUGH A DIFFERENCES ARRAY AT WINANSI CONTROL POSITIONS, FORCING TOUNICODE LOOKUP. diff --git a/tests/Samples/files/issue-457/contents.yml b/tests/Samples/files/issue-457/contents.yml index 3e63a3d5..1a77fc94 100644 --- a/tests/Samples/files/issue-457/contents.yml +++ b/tests/Samples/files/issue-457/contents.yml @@ -81,7 +81,8 @@ pages: Linköping University Electronic Press at [Link to webpage where published]. © The Author(s). This work is licensed under the Choose licence. markdown: |- - **Main title** + ##### **Main title** + **Subtitle (if available)** Anders Andersson 1 and Anna Annasson 2 1Linköpings universitet, Devision and Department, Sweden namn.namn@liu.se diff --git a/tests/Samples/files/libreoffice-different-fonts-sizes/contents.yml b/tests/Samples/files/libreoffice-different-fonts-sizes/contents.yml index a4e955aa..eddea51b 100644 --- a/tests/Samples/files/libreoffice-different-fonts-sizes/contents.yml +++ b/tests/Samples/files/libreoffice-different-fonts-sizes/contents.yml @@ -11,17 +11,18 @@ creationDate: 2025-12-02T18:58:35+01:00 modificationDate: null pages: - - text: |- + text: | Etiam vitae lectus sodales Vestibulum et augue vitae orci sagittis faucibus Donec risus risus Lorem ipsum dolor sit amet viverra a aliquam elementum ornare nec nisl consectetur adipiscing elit - markdown: |- + markdown: |+ Etiam vitae lectus sodales Vestibulum et augue vitae orci sagittis faucibus Donec risus risus Lorem ipsum dolor sit amet viverra a aliquam elementum - ornare nec nisl - consectetur adipiscing elit + # ornare nec nisl + + #### consectetur adipiscing elit diff --git a/tests/Samples/files/libreofficelorem-ipsum-with-titles-and-formatting/contents.yml b/tests/Samples/files/libreofficelorem-ipsum-with-titles-and-formatting/contents.yml index b4d89ffa..3c989baf 100644 --- a/tests/Samples/files/libreofficelorem-ipsum-with-titles-and-formatting/contents.yml +++ b/tests/Samples/files/libreofficelorem-ipsum-with-titles-and-formatting/contents.yml @@ -47,17 +47,21 @@ pages: • Rem beatae quos aut fugit vero. • At adipisci enim id reiciendis officiis. markdown: |- - **Nam quod molestias vel corporis aperiam.** + ### **Nam quod molestias vel corporis aperiam.** + Lorem ipsum dolor sit amet. Et omnis perferendis *Et quisquam qui laboriosam explicabo et natus* *corrupti* aut repudiandae iure quo inventore itaque et odio atque. Qui necessitatibus odit et commodi accusamus **Et fuga**! - **Qui distinctio praesentium sed corporis reiciendis eum molestiae** - **eius.** + #### **Qui distinctio praesentium sed corporis reiciendis eum molestiae** + + #### **eius.** + Qui aperiam aspernatur rem consectetur ullamest quod qui architecto corporis et repellendus expedita! Ex fuga ducimus *Ea ipsam et nobis architecto sed ratione deserunt* et iure sapiente qui animi Quis. Cum quod facilis eos exercitationem quam Est ullam est galisum assumenda cum distinctio tempora qui quasi rerum et pariatur harum. - **Est incidunt repellat aut iusto odit.** + ##### **Est incidunt repellat aut iusto odit.** + Et magnam incidunt eum possimus perspiciatis **Quo pariatur aut perferendis laboriosam eum** **repellat ipsa ut debitis ipsa** ut distinctio dolores! Et rerum expeditaAut ullam ad ullam deleniti est facilis consequatur ut architecto nobis. diff --git a/tests/Samples/files/lorem-ipsum-with-titles-and-formatting-FF-print-to-pdf/contents.yml b/tests/Samples/files/lorem-ipsum-with-titles-and-formatting-FF-print-to-pdf/contents.yml index 3b40738f..2303d994 100644 --- a/tests/Samples/files/lorem-ipsum-with-titles-and-formatting-FF-print-to-pdf/contents.yml +++ b/tests/Samples/files/lorem-ipsum-with-titles-and-formatting-FF-print-to-pdf/contents.yml @@ -45,13 +45,17 @@ pages: eos doloribus autem vel accusamus sequi et quidem reiciendis. ● Ut autem excepturi ut sequi laboriosam est quas debitis et placeat consequatur! markdown: |- - **Nam quod molestias vel corporis** - **aperiam.** + ### **Nam quod molestias vel corporis** + + ### **aperiam.** + Lorem ipsum dolor sit amet. Etomnis perferendis *Et quisquam qui laboriosam explicabo et* *natus corrupti* aut repudiandae iure quo inventore itaque et odioatque. Qui necessitatibus odit et commodi accusamus **Et fuga**! - **Qui distinctio praesentium sed corporis reiciendis eum** - **molestiae eius.** + ##### **Qui distinctio praesentium sed corporis reiciendis eum** + + ##### **molestiae eius.** + Qui aperiam aspernatur rem consectetur ullamest quod quiarchitecto corporis et repellendus expedita! Ex fugaducimus *Ea ipsam et nobis architecto sed ratione deserunt* et iure sapiente qui animi Quis. Cum quod facilis eos exercitationem quam Est ullam est diff --git a/tests/Samples/files/markdown-simple/contents.yml b/tests/Samples/files/markdown-simple/contents.yml index 0eb80d15..cb54f61e 100644 --- a/tests/Samples/files/markdown-simple/contents.yml +++ b/tests/Samples/files/markdown-simple/contents.yml @@ -49,8 +49,10 @@ pages: markdown: |- - Header level A - Header Level B + #### Header level A + + ##### Header Level B + Header Level C Normal text diff --git a/tests/Samples/files/text-objects-across-multiple-streams/contents.yml b/tests/Samples/files/text-objects-across-multiple-streams/contents.yml index 2edc6509..ed19630f 100644 --- a/tests/Samples/files/text-objects-across-multiple-streams/contents.yml +++ b/tests/Samples/files/text-objects-across-multiple-streams/contents.yml @@ -296,7 +296,8 @@ pages: RS-422 Control Panel output will contend with 7707DT - Incorrect Method output. Will not work. + Incorrect Method + output. Will not work. 7707DT Set to RS-422 @@ -328,7 +329,9 @@ pages: RS-422 Control Panel output will contend with 7707DT - **Incorrect Method** output. Will not work. + ##### **Incorrect Method** + + output. Will not work. **7707DT** Set to RS-422 @@ -418,7 +421,8 @@ pages: **7707DT Channel 1 is configured** **Control Panel Control Panel to RS-422 for this example.** - **7707DT 7707DT** + ##### **7707DT 7707DT** + **1 2 3 4 5** **GND - TX +RX --- ---** **6 7 8 9** @@ -658,7 +662,8 @@ pages: **Control Panel Control Panel** **7707DT Channel 2 is configured** **to RS-485 @1200baud for this example.** - **7707DT 7707DT** + ##### **7707DT 7707DT** + **1 2 3 4 5** **GND - TX +RX --- ---** **6 7 8 9** diff --git a/tests/Samples/files/type1-differences-non-ascii/contents.yml b/tests/Samples/files/type1-differences-non-ascii/contents.yml index dca57b45..0f5ecb6b 100644 --- a/tests/Samples/files/type1-differences-non-ascii/contents.yml +++ b/tests/Samples/files/type1-differences-non-ascii/contents.yml @@ -11,5 +11,7 @@ creationDate: null modificationDate: null pages: - - text: 'Für Größe Übung' - markdown: 'Für Größe Übung' + text: | + Für Größe Übung + markdown: |+ + ### Für Größe Übung diff --git a/tests/Samples/files/word365-lorem-ipsum-with-titles-and-formatting/contents.yml b/tests/Samples/files/word365-lorem-ipsum-with-titles-and-formatting/contents.yml index c5fdc52c..564fab25 100644 --- a/tests/Samples/files/word365-lorem-ipsum-with-titles-and-formatting/contents.yml +++ b/tests/Samples/files/word365-lorem-ipsum-with-titles-and-formatting/contents.yml @@ -43,7 +43,8 @@ pages: Ea nihil et ullam repellat et voluptatem delectus . Aut voluptatum pariatur Id molestias cum nobis molestias. Ut velit distinctioEx consectetur eos debitis markdown: |- - Nam quod molestias vel corporis aperiam. + Nam quod molestias vel corporis aperiam. ##### + Lorem ipsum dolor sit amet. Et omnis perferendis *Et quisquam qui laboriosam* *explicabo et natus corrupti* aut repudiandae iure quo inventore itaque et odio atque. Qui necessitatibus odit et commodi accusamus **Et fuga**! diff --git a/tests/Unit/PdfParserTest.php b/tests/Unit/PdfParserTest.php index 18372e16..11be9c5d 100644 --- a/tests/Unit/PdfParserTest.php +++ b/tests/Unit/PdfParserTest.php @@ -12,7 +12,7 @@ class PdfParserTest extends TestCase { public function testParseStringInMemory(): void { static::assertNotFalse($fileContent = file_get_contents(dirname(__DIR__) . '/Feature/samples/h3-simple-string.pdf')); static::assertSame( - ' Hello World ', + ' Hello World ' . PHP_EOL, (new PdfParser()) ->parseString( $fileContent, @@ -23,7 +23,7 @@ public function testParseStringInMemory(): void { public function testParseStringWithFileCache(): void { static::assertNotFalse($fileContent = file_get_contents(dirname(__DIR__) . '/Feature/samples/h3-simple-string.pdf')); static::assertSame( - ' Hello World ', + ' Hello World ' . PHP_EOL, (new PdfParser()) ->parseString( $fileContent, @@ -34,7 +34,7 @@ public function testParseStringWithFileCache(): void { public function testParseFileInMemory(): void { static::assertSame( - ' Hello World ', + ' Hello World ' . PHP_EOL, (new PdfParser()) ->parseFile( dirname(__DIR__) . '/Feature/samples/h3-simple-string.pdf', @@ -45,7 +45,7 @@ public function testParseFileInMemory(): void { public function testParseFileWithoutMemoryStream(): void { static::assertSame( - ' Hello World ', + ' Hello World ' . PHP_EOL, (new PdfParser()) ->parseFile( dirname(__DIR__) . '/Feature/samples/h3-simple-string.pdf',