una tipo tiene que puede porque por para paquete pagina none necesita mostrar letra incrustada fuentes fuente falta extraer esta especificada erroneos encontrar descargar crear correctamente contiene como codificacion cmap cambia and anchos all pdf encoding fonts
pdf-parser.pypdfid.py

tipo - Codificación de fuentes PDF: ¿por qué no puedo copiar texto de un PDF?



para que esta pagina se puede mostrar correctamente se necesita un paquete de fuentes (1)

Después de convertir un archivo PDF, ya no puedo copiar el texto.

Todo lo que obtengo son caracteres ilegibles que no tienen ningún sentido.

La fuente es French Script MT, pero la codificación es personalizada (vea el resultado del lector de Adobe> Archivo> Propiedades del documento> Fuente ).

Here está el PDF.

Probé varios métodos ... editando en editor PDF; notepad ++; Palabra; Acrobat Pro.

  • ¿Hay algún error con el código fuente del archivo PDF que impida la copia correcta de los elementos de texto?

  • ¿Es posible que el código fuente de este PDF pueda ser cambiado / modificado / enmendado para que funcione copiar y pegar texto?


He visto su archivo utilizando diferentes herramientas:

  • qpdf (por Jay Berkenbilt) para analizar el archivo.
  • pdfid.py y pdf-parser.py (por Didier Stevens ) para analizar más.
  • TET (herramienta de extracción de texto) de PDFlib para intentar extraer texto.
  • El plugin Acrobat {, Reader} de PDFlib Font Reporter para generar una tabla con glifos utilizados por el PDF.
  • pdffonts línea de comandos pdffonts de Poppler.

Incluso TET no pudo extraer el texto. Y TET es lo mejor que conozco para esta tarea: a menudo tiene éxito donde otros métodos fallan.

Mi análisis me dio los siguientes resultados:

  1. pdffonts da una primera visión general rápida. Devuelve la siguiente información:

    $ pdffonts "so#12703387-problem.pdf" name type encoding emb sub uni object ID ------------------------- ------------ ----------- --- --- --- --------- YLWHHJ+FrenchScriptMT Type 1C Custom yes yes no 14 0

    La columna uni debe contener una entrada de yes . El no en esa columna indica que /ToUnicode tabla /ToUnicode en la fuente utilizada por el PDF. Esa fuente está incrustada como un subconjunto con el nombre YLWHHJ+FrenchScriptMT . También utiliza una codificación de fuente Custom (lo más probable es que use una matriz /Differences ). Sin una tabla correcta y completa /ToUnicode será imposible extraer el texto correctamente.

  2. El creador de PDF utilizado para generar este PDF fue PDFCreator Versión 1.0.2 basado en la versión muy antigua de Ghostscript 8.70 . (Esto se revela ejecutando "pdfinfo so#12703387-problem.pdf" .)

  3. La fuente utilizada es un subconjunto de FrenchScriptMT , que contiene 94 glifos diferentes.

  4. La codificación de la fuente es "Personalizada", utilizando una matriz /Differences .

  5. El dibujo de texto en el PDF utiliza predominantemente el operador TJ , que permite el posicionamiento individual de glifos.

  6. Todas las operaciones de dibujo de texto hacen un uso extensivo de la función ''posicionamiento de glifo individual''. Casi todos los glifos se colocan individualmente, como puede ver en este fragmento de código (primera aparición de TJ ):

    [<01>-3.18894<02>3.62397<02>3.62397<03>-2.42535<04>3.12889<05>3.88047<06> -14.1669<07>-3.7221<02>-4.37556<04>3.62397(/b)-4.88286(/t)3.88047<01> -3.18874(/n)1.29105<06>-13.6718(/b)-4.88245<0b>1.78573<02>3.1293<06> -21.6714<04>3.62438(/f)0.553714(/r)0.0464142<0e>-1.28494<0f>-0.448671<10> 3.88007<06>-21.6714(/b)-4.88245<0b>1.78573<02>3.1293<06>-13.6718<11> 0.0920142<02>-4.37515<04>3.62438(/b)2.622<06>-13.6718<03> -10.4245(/t)3.88007<11>0.0920142<02>3.62438<12>-6.14134(/b)3.11708<13> 3.3858<14>0.0455999<15>-7.42628<06>-14.1669<16>2.90048(/r)0.0455999<17> -1.88425(/r)0.0455999<0b>1.78654(/r)]TJ

  7. Como se puede ver en ''6'', las operaciones de dibujo de texto no usan ''una secuencia de caracteres literales entre paréntesis ()'' , sino que usan ''datos hexadecimales entre paréntesis angulares <>'' (consulte las especificaciones de PDF , capítulo 7.3. 4.1).

  8. Los valores hexadecimales para los nombres de caracteres no coinciden fácilmente con los nombres de caracteres (aunque se supone que se derivan de WinAnsiEncoding ).

    Uno tiene que buscar primero la tabla de codificación personalizada.

    pdf-parser.py -s encoding so#12703387-problem.pdf el comando pdf-parser.py -s encoding so#12703387-problem.pdf para esto. Resultado:

    << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 1 /g81 /g72 /g71 /g86 /g30 /g3 /g53 /g87 /g76 /g74 (... skipping some lines of output ...) /g32 /g170 /g105 /g103 /g95 ] >>

  9. Ahora que el último punto expone el quid de la materia: la tabla de codificación de la fuente no usa nombres de caracteres estándar. En su lugar, utiliza 1 , /g81 , /g72 , ... /g95 (en total 94 nombres diferentes).

  10. Mi último punto sobre los nombres de glifos también se confirma por los resultados del complemento FontReporter de PDFlib:

  11. Ninguna herramienta que trabaje automáticamente para la extracción de texto (ninguna que yo sepa, al menos) podría hacer cabezas y colas de este desastre. Un experto humano podría, pero ni siquiera lo intenté (porque no te ayudaría mucho; mira mi currículum para obtener una mejor ayuda).

  12. La mejor manera, en general, para la extracción automatizada de texto para este tipo de codificaciones de fuente es utilizar el OCR (reconocimiento óptico de caracteres). Sin embargo, en este caso, el tipo de fuente utilizado ( ''French Script MT'' ) no funcionará bien con OCR.

  13. En teoría, debería ser posible agregar un código PDF al archivo PDF existente que en efecto agrega la tabla /ToUnicode faltante. No tengo conocimiento de ninguna herramienta que pueda hacer esto automáticamente. Añadir esto implicaría:

    • re-verse la ingeniería del archivo PDF, entonces
    • escribiendo la mesa a mano, luego
    • insertándolo en el lugar correcto del archivo PDF como un objeto PDF separado, luego
    • insertando una entrada que apunta a esa tabla en el diccionario del objeto de fuente, y por último
    • actualice la tabla de xref del archivo PDF con las compensaciones de bytes correctas a todas las ID de objeto que se vieron afectadas por los cambios.

Curriculum vitae - Mi consejo para usted:

  1. Vuelva a crear su PDF.
  2. Si es posible, base tu PDFCreator en una versión más reciente de Ghostscript.
  3. Cambie la configuración de PDFCreator para que ya no cree un subconjunto de fuentes. Asegúrese de que la fuente original esté totalmente incrustada .

Entonces, muy probablemente, el problema de la codificación de la fuente desaparecerá y podrá copiar y pegar texto de su PDF.

Actualizar:

Creé 5 archivos PDF de muestra, codificados a mano, que exponen el problema causado por una tabla faltante o incorrecta / manipulada /ToUnicode en un PDF. Estas muestras ahora están comprometidas con nuestro repositorio de GitHub creado recientemente y dedicado a proporcionar archivos PDF de muestra que se pueden usar para estudiar, aprender y explorar la sintaxis de PDF mirando su código fuente. Estos 5 archivos están en el subdirectorio ''textextract'' :