From 51a0fb2dad330fa089a2cda0f5138163da45f0ab Mon Sep 17 00:00:00 2001 From: PrinsFrank <25006490+PrinsFrank@users.noreply.github.com> Date: Fri, 5 Jun 2026 19:30:23 +0200 Subject: [PATCH] TextShowingOperator interacts with transformation matrix resulting in offsetY changes --- .../Command/Operator/State/TextShowingOperator.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Document/ContentStream/Command/Operator/State/TextShowingOperator.php b/src/Document/ContentStream/Command/Operator/State/TextShowingOperator.php index 9a5cfe7..81864f6 100644 --- a/src/Document/ContentStream/Command/Operator/State/TextShowingOperator.php +++ b/src/Document/ContentStream/Command/Operator/State/TextShowingOperator.php @@ -5,6 +5,7 @@ use Override; use PrinsFrank\PdfParser\Document\ContentStream\Command\Operator\State\Interaction\InteractsWithTextState; +use PrinsFrank\PdfParser\Document\ContentStream\Command\Operator\State\Interaction\InteractsWithTransformationMatrix; use PrinsFrank\PdfParser\Document\ContentStream\Command\Operator\State\Interaction\ProducesPositionedTextElements; use PrinsFrank\PdfParser\Document\ContentStream\PositionedText\PositionedTextElement; use PrinsFrank\PdfParser\Document\ContentStream\PositionedText\TransformationMatrix; @@ -12,12 +13,22 @@ use PrinsFrank\PdfParser\Exception\ParseFailureException; /** @internal */ -enum TextShowingOperator: string implements InteractsWithTextState, ProducesPositionedTextElements { +enum TextShowingOperator: string implements InteractsWithTextState, ProducesPositionedTextElements, InteractsWithTransformationMatrix { case SHOW = 'Tj'; case MOVE_SHOW = '\''; case MOVE_SHOW_SPACING = '"'; case SHOW_ARRAY = 'TJ'; + #[Override] + public function applyToTransformationMatrix(string $operands, TransformationMatrix $transformationMatrix, TextState $textState): TransformationMatrix { + if ($this === self::MOVE_SHOW || $this === self::MOVE_SHOW_SPACING) { + return (new TransformationMatrix(1, 0, 0, 1, 0.0, -$textState->leading)) + ->multiplyWith($transformationMatrix); + } + + return $transformationMatrix; + } + /** @throws ParseFailureException */ #[Override] public function applyToTextState(string $operands, TextState $textState): TextState {