wie füge ich unicode in truetype0font auf pdfbox 2.0.0 hinzu?

Lesezeit: 4 Minuten

wie fuge ich unicode in truetype0font auf pdfbox 200 hinzu
Omri A

Ich habe die PDFBOX-Version 2.0.0 in einem Java-Projekt verwendet, um PDFs in Text zu konvertieren.

Einigen meiner PDFs fehlt die ToUnicode-Methode, sodass sie in Gibberish ausgegeben werden, während ich sie exportiere.

2016-09-14 10:44:55 WARN org.apache.pdfbox.pdmodel.font.PDSimpleFont(1):322 - No Unicode mapping for 694 (30) in font MPBAAA+F1

im obigen WARN wurde anstelle des echten Zeichens ein Kauderwelsch-Unicode (30) angezeigt.

Ich konnte es überwinden, indem ich die bearbeitete additional.txt Datei in pdfbox, da ich durch Versuch und Irrtum verstanden habe, dass der Code des Zeichens (in diesem Fall 694) einen bestimmten hebräischen Buchstaben (צ) darstellt.

Hier ist ein kurzes Beispiel dafür, was ich in der Datei bearbeitet habe:

-694;05E6 #HexaDecimal value for the letter צ
-695;05E7
-696;05E8

später bin ich auf fast die gleiche Warnung in einem anderen PDF gestoßen, aber anstelle von Kauderwelschzeichen habe ich überhaupt keine Zeichen erhalten. Eine ausführlichere Erläuterung dieses Problems finden Sie hier – PDF-Lesen über pdfbox in Java

2016-09-14 11:07:10 WARN org.apache.pdfbox.pdmodel.font.PDType0Font(1):431 - No Unicode mapping for CID+694 (694) in font ABCDEE+Tahoma,Bold

Wie Sie sehen können, kam die Warnung von einer anderen Klasse (PDType0Font) statt der ersten Warnung (PDSimpleFont), aber der Codename (694) ist in beiden derselbe und beide sprechen über denselben Charakter.

Gibt es eine andere Datei, die ich bearbeiten sollte, außer additional.txt um den 694-Code (den hebräischen Buchstaben צ) auf seinen korrekten Unicode zu verweisen?

Danke
Hauptwurzel

Drilldown auf die erste Type0-Schriftart

  • Bitte teilen Sie das PDF.

    – Tilman Hausherr

    14. September 16 um 08:51 Uhr

  • Ich wünschte, ich könnte, leider ist es geheim. Ich werde versuchen, ein gleichwertiges Dokument zu finden, das denselben Fehler enthält

    – Omri A

    15. September 16 um 12:55 Uhr

  • Alternativ / zusätzlich könntest du die Datei mit PDFDebugger öffnen und einen Screenshof des Schriftteils machen. Es befindet sich unter Root/Pages/Kids/[0]/Kinder/[0]/Ressourcen/Schriftart . Es wäre interessant, “Encoding” und “ToUnicode” zu sehen.

    – Tilman Hausherr

    15. September 16 um 12:58 Uhr


  • Hallo Tilman, ich habe die Dokumente in die ursprüngliche Nachricht eingefügt. Vielen Dank für Ihre Hilfe!

    – Omri A

    19. September 16 um 12:38 Uhr


  • Diejenigen, die WinAnsiEncoding haben, sollten in Ordnung sein. Aber die anderen vermissen “ToUnicode”. In der PDF 32000-Spezifikation adobe.com/content/dam/Adobe/de/devnet/acrobat/pdfs/…lesen Sie den Abschnitt „9.10 Extraktion von Textinhalten“.

    – Tilman Hausherr

    19. September 16 um 13:21 Uhr

wie fuge ich unicode in truetype0font auf pdfbox 200 hinzu
Tilmann Hausherr

Hier ist ein Code zum Hinzufügen eines ToUnicode CMap-Streams in einer Schriftart. Offensichtlich kann ich das mit Ihrer Datei nicht machen, also habe ich eine meiner Testdateien verwendet, die zu finden sind Hier. Ich musste jeden Eintrag einzeln bearbeiten und habe nicht alles gemacht. Das Ergebnis ist jedoch gut genug, um das erste Wort im Gründruck (“Bedingungen”) zu extrahieren.

Das Szenario ist etwas auf Sie zugeschnitten:

  • Identität-H-Eintrag
  • kein ToUnicode-Eintrag
  • bestimmten Schriftartnamen

    try (PDDocument doc = PDDocument.load(f))
    {
        for (int p = 0; p < doc.getNumberOfPages(); ++p)
        {
            PDPage page = doc.getPage(p);
            PDResources res = page.getResources();
            for (COSName fontName : res.getFontNames())
            {
                PDFont font = res.getFont(fontName);
                COSBase encoding = font.getCOSObject().getDictionaryObject(COSName.ENCODING);
                if (!COSName.IDENTITY_H.equals(encoding))
                {
                    continue;
                }
                // get real name
                String fname = font.getName();
                int plus = fname.indexOf('+');
                if (plus != -1)
                {
                    fname = fname.substring(plus + 1);
                }
                if (font.getCOSObject().containsKey(COSName.TO_UNICODE))
                {
                    continue;
                }
                System.out.println("File '" + f.getName() + "', page " + (p + 1) + ", " + fontName.getName() + ", " + font.getName());
                if (!fname.startsWith("Calibri-Bold"))
                {
                    continue;
                }
                COSStream toUnicodeStream = new COSStream();
                try (PrintWriter pw = new PrintWriter(toUnicodeStream.createOutputStream(COSName.FLATE_DECODE)))
                {
                    // "9.10 Extraction of Text Content" in the PDF 32000 specification
                    pw.println ("/CIDInit /ProcSet findresource beginn" +
                            "12 dict beginn" +
                            "begincmapn" +
                            "/CIDSystemInfon" +
                            "<< /Registry (Adobe)n" +
                            "/Ordering (UCS) /Supplement 0 >> defn" +
                            "/CMapName /Adobe-Identity-UCS defn" +
                            "/CMapType 2 defn" +
                            "1 begincodespacerangen" +
                            "<0000> <FFFF>n" +
                            "endcodespacerangen" +
                            "10 beginbfcharn" + // number is count of entries
                            "<0001><0020>n" + // space
                            "<0002><0041>n" + // A
                            "<0003><0042>n" + // B
                            "<0004><0044>n" + // D
                            "<0013><0065>n" + // e
                            "<0012><0064>n" + // d
                            "<0017><0069>n" + // i
                            "<001B><006E>n" + // n
                            "<0015><0067>n" + // g
                            "<0020><0075>n" + // u
                            "endbfcharn" +
                            "endcmap CMapName currentdict /CMap defineresource pop end end");
                }
                font.getCOSObject().setItem(COSName.TO_UNICODE, toUnicodeStream);
            }
        }
        doc.save("huhu.pdf");
    }
    

Übrigens hat die unveröffentlichte Version 2.1 von PDFDebugger einige verbesserte Funktionen zum Anzeigen von Schriftarten, Sie können es bekommen Hier:

Sie können es verwenden, um zu überprüfen, ob Ihre ToUnicode-CMap sinnvoll ist. Folgendes bekomme ich mit meinen Änderungen:
Geben Sie hier die Bildbeschreibung ein

.

676930cookie-checkwie füge ich unicode in truetype0font auf pdfbox 2.0.0 hinzu?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy