Mam kilka PDF, które mają obrazy obracane i odwrócone. Próbka obrazu:

inverted and rotated text

Sam obiekt strony nie ma instrukcji rotacji, ale wydaje się, że może być używany przez operatora CM w strumieniu treści, aby wykonać transformację dla renderowanego PDF:

...snip...
q
  0.05 0 0 -0.05 0 768 cm
  q
    0 0 11880 15360 re
    W*
    n
    /GS0 gs
    1 J
    [ ] 0 d
    2 w
    0 0 0 RG
    /GS0 gs
    1 1 1 rg
    /GS0 gs
    1 1 1 rg
    /GS0 gs
    1 J
    [ ] 0 d
    2 w
    0 0 0 RG
    q
      11865 0 0 15360 0 -3 cm
      /Image1 Do
    Q
...snip...    

Czy jestem tutaj na właściwym miejscu?

Używamy już PDFstreameNgine do analizy obrazów, więc pomyślałem, że może użycie aktualnego stanu graficznego

protected class DrawObjectCounter extends OperatorProcessor {
   @Override
   public void process(Operator operator, List<COSBase> operands) throws IOException {
       System.out.println(getGraphicsState().getCurrentTransformationMatrix());
       ...snip...
   }
...snip...   

Wyjście jest zawsze:

[1.0,0.0,0.0,1.0,0.0,0.0]

Czy muszę śledzić operatorów CM z innym operatoraProcesor, czy nie tylko nie patrzę we właściwym miejscu?

0
Mike Cantrell 18 marzec 2020, 20:05

1 odpowiedź

Najlepsza odpowiedź

Miałem problem w budowie mojego pdfstreamengine. Musiałem rejestrować operatorzy, aby wykonać modyfikacje matrycy:

public PdfImageStreamEngine() {
    // pdfbox operators
    addOperator(new Save());
    addOperator(new Concatenate());
    addOperator(new Restore());
    // custom operators
    addOperator(new DrawObjectCounter());
    addOperator(new BeginInlineImageCounter());
    addOperator(new LineToCounter());
}

Po zarejestrowaniu odpowiednich procesorów operatora, GetCurrentransformationMatrix miał prawidłową wartość.

0
Mike Cantrell 19 marzec 2020, 16:07