unicode pdfbox glyph

¿Cómo agregar unicode en truetype0font en pdfbox 2.0.0?



glyph (1)

He estado usando PDFBOX versión 2.0.0 en un proyecto Java para convertir archivos PDF a texto.

a varios de mis archivos PDF les falta el método ToUnicode, por lo que salen en Gibberish mientras los exporto.

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

en el WARN anterior, en lugar del personaje real, se presentó un galimatías unicode (30).

Pude superarlo editando el archivo additional.txt en pdfbox, ya que por prueba y error entendí que el código del carácter (694 en este caso) representa una cierta letra hebrea (צ).

Aquí hay un breve ejemplo de lo que he editado dentro del archivo:

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

Más tarde, me encontré con casi la misma advertencia en un PDF diferente, pero en lugar de caracteres galimatizantes no obtuve ningún tipo de caracteres. Aquí se puede ver una explicación más detallada de este problema: lectura de PDF a través de pdfbox en 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

Como puede ver, la advertencia vino de una clase diferente ( PDType0Font ) en lugar de la primera advertencia ( PDSimpleFont ), pero el nombre en código (694) es el mismo en ambos y ambos están hablando del mismo personaje.

¿Hay un archivo diferente que debería editar que no sea additional.txt para señalar el código 694 (la letra hebrea צ) a su unicode correcto?

Gracias


Aquí hay un código para agregar una secuencia ToUnicode CMap en una fuente. Obviamente no puedo hacerlo con su archivo, así que utilicé uno de mis archivos de prueba, que se pueden encontrar here . Tuve que trabajar en cada entrada por separado y no hice todo. Sin embargo, el resultado es lo suficientemente bueno como para extraer la primera palabra en la letra verde ("Bedingungen").

El escenario está algo adaptado a ti:

  • Entrada de identidad H
  • sin entrada ToUnicode
  • nombre de fuente específico

    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> <FFFF>/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"); }

Por cierto, la versión 2.1 inédita de PDFDebugger tiene algunas características mejoradas para mostrar las fuentes, puede obtenerla here :

Puede usarlo para verificar que su CMU ToUnicode tenga sentido. Esto es lo que obtengo con mis cambios: