diff --git a/src/Document/Object/Decorator/Page.php b/src/Document/Object/Decorator/Page.php index 36e6b1f..7c1ecef 100644 --- a/src/Document/Object/Decorator/Page.php +++ b/src/Document/Object/Decorator/Page.php @@ -13,7 +13,6 @@ use PrinsFrank\PdfParser\Exception\ParseFailureException; use PrinsFrank\PdfParser\Exception\PdfParserException; use PrinsFrank\PdfParser\Extraction\Text\TextExtractor; -use PrinsFrank\PdfParser\Extraction\Text\TextGrouping\LineGrouping\TextOverlapStrategy; class Page extends DecoratedObject { /** @@ -27,7 +26,7 @@ public function getPositionedTextElements(): array { /** @throws PdfParserException */ public function getText(): string { - return TextExtractor::extractText($this->getPositionedTextElements(), $this->document, $this, new TextOverlapStrategy()); + return TextExtractor::extractText($this->getPositionedTextElements(), $this->document, $this); } /** @throws PdfParserException */ diff --git a/src/Extraction/Text/TextExtractor.php b/src/Extraction/Text/TextExtractor.php index 8033673..4ea8dca 100644 --- a/src/Extraction/Text/TextExtractor.php +++ b/src/Extraction/Text/TextExtractor.php @@ -6,16 +6,18 @@ use PrinsFrank\PdfParser\Document\Document; use PrinsFrank\PdfParser\Document\Object\Decorator\Page; use PrinsFrank\PdfParser\Exception\PdfParserException; -use PrinsFrank\PdfParser\Extraction\Text\TextGrouping\LineGrouping\LineGroupingStrategy; +use PrinsFrank\PdfParser\Extraction\Text\TextGrouping\LineGrouping\TextOverlapStrategy; class TextExtractor { /** * @param list $positionedTextElements * @throws PdfParserException */ - public static function extractText(array $positionedTextElements, Document $document, Page $page, LineGroupingStrategy $lineGroupingStrategy): string { + public static function extractText(array $positionedTextElements, Document $document, Page $page): string { + $lineGroupedElements = TextOverlapStrategy::group($positionedTextElements); + $text = ''; - foreach ($lineGroupingStrategy->group($positionedTextElements) as $i => $positionedTextElementsForLine) { + foreach ($lineGroupedElements as $i => $positionedTextElementsForLine) { if ($i !== 0) { $text .= "\n"; } diff --git a/src/Extraction/Text/TextGrouping/LineGrouping/LineGroupingStrategy.php b/src/Extraction/Text/TextGrouping/LineGrouping/LineGroupingStrategy.php deleted file mode 100644 index 3234948..0000000 --- a/src/Extraction/Text/TextGrouping/LineGrouping/LineGroupingStrategy.php +++ /dev/null @@ -1,13 +0,0 @@ - $positionedTextElements - * @return iterable> - */ - public function group(array $positionedTextElements): iterable; -} diff --git a/src/Extraction/Text/TextGrouping/LineGrouping/StrictLineGrouping.php b/src/Extraction/Text/TextGrouping/LineGrouping/StrictLineGrouping.php deleted file mode 100644 index 766c70e..0000000 --- a/src/Extraction/Text/TextGrouping/LineGrouping/StrictLineGrouping.php +++ /dev/null @@ -1,39 +0,0 @@ -absoluteMatrix->offsetY) <=> abs($a->absoluteMatrix->offsetY)) !== 0) { - return $differenceY; - } - - return $a->absoluteMatrix->offsetX <=> $b->absoluteMatrix->offsetX; - }, - ); - - $previousPositionedTextElement = null; - $positionedTextElementsInCurrentLine = []; - foreach ($positionedTextElements as $positionedTextElement) { - if ($previousPositionedTextElement !== null && $previousPositionedTextElement->absoluteMatrix->offsetY !== $positionedTextElement->absoluteMatrix->offsetY) { - yield $positionedTextElementsInCurrentLine; - $positionedTextElementsInCurrentLine = []; - } - - $positionedTextElementsInCurrentLine[] = $positionedTextElement; - $previousPositionedTextElement = $positionedTextElement; - } - - if ($positionedTextElementsInCurrentLine !== []) { - yield $positionedTextElementsInCurrentLine; - } - } -} diff --git a/src/Extraction/Text/TextGrouping/LineGrouping/TextOverlapStrategy.php b/src/Extraction/Text/TextGrouping/LineGrouping/TextOverlapStrategy.php index f6c3c7f..55ec023 100644 --- a/src/Extraction/Text/TextGrouping/LineGrouping/TextOverlapStrategy.php +++ b/src/Extraction/Text/TextGrouping/LineGrouping/TextOverlapStrategy.php @@ -2,7 +2,6 @@ namespace PrinsFrank\PdfParser\Extraction\Text\TextGrouping\LineGrouping; -use Override; use PrinsFrank\PdfParser\Document\ContentStream\PositionedText\PositionedTextElement; /** @@ -17,14 +16,14 @@ * Strategy where we sort all positioned text elements, retrieve the very first text element from the page (highest) * And for each text element check if there is significant overlap above a threshold. Continue until all elements are processed */ -class TextOverlapStrategy implements LineGroupingStrategy { - /** @param int<0, 100> $overlapPercentage */ - public function __construct( - private readonly int $overlapPercentage = 90, - ) {} +class TextOverlapStrategy { + private const OVERLAP_PERCENTAGE = 90; - #[Override] - public function group(array $positionedTextElements): iterable { + /** + * @param list $positionedTextElements + * @return iterable> + */ + public static function group(array $positionedTextElements): iterable { usort( $positionedTextElements, fn(PositionedTextElement $a, PositionedTextElement $b): int => $b->absoluteMatrix->offsetY <=> $a->absoluteMatrix->offsetY, @@ -66,7 +65,7 @@ public function group(array $positionedTextElements): iterable { } $overlap = min($highestElementTop, $currentElementTop) - max($highestPositionedTextElementBottom, $currentElementBottom); - $belongsOnLine = $overlap / $smallestElementHeight * 100 >= $this->overlapPercentage; + $belongsOnLine = $overlap / $smallestElementHeight * 100 >= self::OVERLAP_PERCENTAGE; $isEnclosedSubscript = $overlap > 0.0 && $positionedTextElementHeight < $highestPositionedTextElementHeight && $positionedTextElement->absoluteMatrix->offsetX >= $lineLeftX diff --git a/tests/Unit/Document/ContentStream/PositionedText/LineGroupingStrategy/TextOverlapStrategyTest.php b/tests/Unit/Document/ContentStream/PositionedText/LineGroupingStrategy/TextOverlapStrategyTest.php index abc937d..6ee59a7 100644 --- a/tests/Unit/Document/ContentStream/PositionedText/LineGroupingStrategy/TextOverlapStrategyTest.php +++ b/tests/Unit/Document/ContentStream/PositionedText/LineGroupingStrategy/TextOverlapStrategyTest.php @@ -19,7 +19,7 @@ public function testOrdersLinesTopToBottom(): void { static::assertSame( [[$top], [$bottom]], - iterator_to_array((new TextOverlapStrategy())->group([$bottom, $top]), false), + iterator_to_array(TextOverlapStrategy::group([$bottom, $top]), false), ); } @@ -33,7 +33,7 @@ public function testOrdersLinesTopToBottomOnANegativeOriginPage(): void { static::assertSame( [[$top], [$bottom]], - iterator_to_array((new TextOverlapStrategy())->group([$bottom, $top]), false), + iterator_to_array(TextOverlapStrategy::group([$bottom, $top]), false), ); } }