Java ApachePDFBox - Welches Encoding ist das?

bronks

Ensign
Registriert
Mai 2019
Beiträge
197
Servus!

Ich zerlege gerade eine PDF mit dem PDFStreamParser der Apache PDFBox. Die PDF-Datei habe ich mit dem aktuellen MS Word erstellt. Einmal als PDF gespeichert und einmal über den Druckfilter. Die PDFs enthalten "AABCCDEEFGG"

Wenn ich das ByteArray des COSString vor dem TJ-Operator ausgebe erhalte ich zwei Byte je Zeichen. Eines mit NULL und das zweite enthält einen Wert. Für beide PDF erhalte ich diese Ausgabe.
Code:
0 4 0 4 0 17 0 18 0 18 0 24 0 28 0 28 0 38 0 39 0 39 0 3

Das Muster passt zu den Buchstaben aus der PDF, aber wie komme ich z.B. von 04 auf ein A? Was ist das für ein Encoding?


Code:
                if (op.getName().equals("TJ")) {
                        COSArray cosArray = (COSArray) tokens.get(j - 1);

                        for (int k = 0; k < cosArray.size(); k++) {
                            Object arrElement = cosArray.getObject(k);
                            if (arrElement instanceof COSString) {
                                COSString cosString = (COSString) arrElement;
                               
                                byte[] bytes = ((COSString) arrElement).getBytes();
                               
                                for(byte b : bytes){
                                    System.out.print(b + " ");
                                }
                            }
                        }
                    }
 
Zuletzt bearbeitet:
Von https://pdfbox.apache.org/3.0/faq.h...bberish(g38g43g36g51g5)-when-extracting-text?:
How come I am getting gibberish(G38G43G36G51G5) when extracting text?

This is because the characters in a PDF document can use a custom encoding instead of unicode or ASCII. When you see gibberish text then it probably means that a meaningless internal encoding is being used. The only way to access the text is to use OCR. This may be a future enhancement.

So wie du die PDF erzeugt hast wundert es mich aber das die nicht einfach so lesbar ist. Die Schnittstelle die du nutzt scheint sehr low-level zu sein, manuell die tokens zu durchlaufen.

Hier gibt es ein Beispiel wie man den Text pro Seite aus dem Dokument extrahiert: https://github.com/apache/pdfbox/bl...e/pdfbox/examples/util/ExtractTextSimple.java

Im einfachsten Fall wohl:
Java:
PDDocument doc = Loader.loadPDF(new File("abc.pdf"));
String text = new PDFTextStripper().getText(doc);

Beachte aber die Dokumentation zur getText()-Methode: https://javadoc.io/static/org.apach...getText-org.apache.pdfbox.pdmodel.PDDocument-
z.B. Das Text in der PDF nicht in der Reihenfolge gerendert werden muss wie er angezeigt wird. Dazu solle setSortByPosition() auf dem PDFTextStripper eingestellt werden. Dies macht auch das verlinkte Beispiel.
 
Danke!

Marco01_809 schrieb:
So wie du die PDF erzeugt hast wundert es mich aber das die nicht einfach so lesbar ist.
Wenn ich das gleiche mit Word 2010 und der uralten Version 1.2.3 des PdfCreators mache, dann erhalte ich eine PDF mit ISO-8859-1. Welches ich mit meiner Methode unkompliziert lesen und bearbeiten kann.

Marco01_809 schrieb:
Die Schnittstelle die du nutzt scheint sehr low-level zu sein, manuell die tokens zu durchlaufen.
Ich mache das so, weil ich Texte ersetzen und einfügen möchte.

Marco01_809 schrieb:
Beachte aber die Dokumentation zur getText()-Methode
Im Code des PDFTextStripper habe ich schon stundenlang herumgelesen. Ich habe mich immer wieder irgendwo verlaufen und leider nicht die Stelle gefunden, wo es um das Encoding und Extraction geht.
 
Kann der PDFTextStripper denn Text aus den PDFs vom modernen Word extrahieren?

Habe Word lange nicht benutzt aber ich würde ich mal schauen ob es da irgendwo erweiterte Einstellungen zum PDF Export gibt, vielleicht kriegt mans hin dass auch der PDFs mit einfacherem Encoding ausgibt.
 
Zurück
Oben