come aggiungere unicode in truetype0font su pdfbox 2.0.0?

Sto usando il PDFBOX versione 2.0.0 in un progetto Java per convertire i pdf in testo.

molti dei miei pdf mancano del metodo ToUnicode, quindi escono in Gibberish mentre li esporto.

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

nel WARN sopra, invece del vero carattere, è stato presentato un unicode senza senso (30).

Sono stato in grado di superarlo modificando il file additional.txt in pdfbox, poiché da trial & error ho capito che il codice del personaggio (694 in questo caso) rappresenta una certa lettera ebraica (צ).

ecco un breve esempio di ciò che ho modificato all’interno del file:

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

più tardi ho riscontrato quasi lo stesso avvertimento in un pdf diverso, ma invece di caratteri senza senso non ho avuto alcun personaggio. un’illustrazione più dettagliata di questo problema può essere vista qui – lettura pdf tramite 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

Come puoi vedere, l’avviso proviene da una class diversa ( PDType0Font ) piuttosto che dal primo avviso ( PDSimpleFont ), ma il nome in codice (694) è lo stesso in entrambi e stanno entrambi parlando dello stesso personaggio.

C’è un file diverso che dovrei modificare diverso da additional.txt per puntare il codice 694 (la lettera ebraica צ) al suo unicode corretto?

Grazie radice principale

drill down sul primo font type0

Ecco un codice per aggiungere uno stream ToUnicode CMap in un font. Ovviamente non posso farlo con il tuo file, quindi ho usato uno dei miei file di test, che può essere trovato qui . Ho dovuto lavorare su ogni voce separatamente e non ho fatto tutto. Tuttavia, il risultato è sufficiente per estrarre la prima parola nella stampa verde (“Bedingungen”).

Lo scenario è un po ‘su misura per voi:

  • Identity-H entry
  • nessuna voce ToUnicode
  • nome del carattere specifico

     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 begin\n" + "12 dict begin\n" + "begincmap\n" + "/CIDSystemInfo\n" + "<< /Registry (Adobe)\n" + "/Ordering (UCS) /Supplement 0 >> def\n" + "/CMapName /Adobe-Identity-UCS def\n" + "/CMapType 2 def\n" + "1 begincodespacerange\n" + "<0000> \n" + "endcodespacerange\n" + "10 beginbfchar\n" + // 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 "endbfchar\n" + "endcmap CMapName currentdict /CMap defineresource pop end end"); } font.getCOSObject().setItem(COSName.TO_UNICODE, toUnicodeStream); } } doc.save("huhu.pdf"); } 

Btw la versione 2.1 inedita di PDFDebugger ha alcune funzionalità migliorate per mostrare i caratteri, è ansible ottenerlo qui :

Puoi usarlo per verificare che il tuo ToUnicode CMap abbia senso. Ecco cosa ottengo con le mie modifiche: inserisci la descrizione dell'immagine qui