Cómo ver y editar el código de un archivo PDF

12

Me preguntaba cómo ver y editar el código de un archivo PDF.

  1. Al ver, no quiero ver el formato binario, así que creo que hexdumppuede no ser lo que quiero. Lo intenté gedit, pero no se puede utilizar ningún método de codificación para decodificar el contenido PDF.

  2. Al editar, me gustaría buscarlos /Fity cambiarlos /XYZpor, por ejemplo, sed. Pero mi comando sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfparece no cambiar la apariencia de mi PDF como esperaba, aunque no informa ningún error. Me preguntaba si sedrealmente puede trabajar en archivos PDF como si fueran texto sin formato.

El contexto de mis preguntas se puede encontrar en esta pregunta . Mi sistema operativo es Ubuntu 10.10.

Tim
fuente

Respuestas:

9

Puede usar sedarchivos binarios (al menos GNU sed; algunas implementaciones pueden tener problemas con archivos que contienen caracteres nulos o que no terminan con un carácter de nueva línea). Pero el comando que usó solo reemplaza la primera aparición de /Fiten cada línea, y las líneas no tienen sentido en un archivo PDF. Necesita reemplazar todas las ocurrencias:

 sed s/\/Fit/\/XYZ/g

Sería más robusto reemplazar solo /Fitsi no es seguido por un componente de la palabra (por ejemplo, no reemplazar /Fitness; no sé si su archivo contiene ocurrencias /Fitque podrían causar problemas). Aquí hay una manera:

perl -pe 's!/Fit\b!/XYZ!g'
Gilles 'SO- deja de ser malvado'
fuente
¡Gracias! ¡Ahora funciona! (1) Me preguntaba cómo sed buscar personajes en contenido binario? ¿Sed codifica en primer lugar los caracteres de consulta antes de la búsqueda? (2) En el último comando, lo que hace !, \by gsignifica? ¿Se puede hacer sin perl solo con sed?
Tim
1
@Tim (1) Sed carga los datos en la memoria, los opera y los imprime. ¿Por qué necesitaría codificar algo? (2) gsignifica reemplazar todas las ocurrencias en cada línea, tanto en sed como en perl. !es el separador puede elegir (casi) cualquier carácter como separador para el scomando (esto va tanto en sed como en perl). \bsignifica un límite de palabra; existe en perl pero no en sed.
Gilles 'SO- deja de ser malvado'
Acerca de (1), porque los caracteres que le das a sed en el comando son legibles por humanos. Si el contenido para buscar es completamente binario, ¿cómo puede encontrar la palabra de consulta allí?
Tim
@Tim Text son datos binarios que resultan ser legibles por humanos.
Gilles 'SO- deja de ser malvado'
1
@Tim Sí, puede pasar datos binarios en la consulta. Tendrá que insertar los caracteres literalmente en su código fuente sed o shell.
Gilles 'SO- deja de ser malvado'
17

Con respecto a su primera pregunta ("ver el código fuente, pero no binario"): hay algunas opciones que tiene para descomprimir las secuencias binarias internas que se adjuntan a muchos objetos.

Mi herramienta favorita para esto es QPDF , disponible en todas las plataformas principales del sistema operativo. El siguiente comando descomprime todas las secuencias y todas las secuencias de objetos:

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

Ahora puede abrir su PDF en cualquier editor de texto. (Todavía puede haber algunos blobs binarios allí: por ejemplo, archivos de fuentes y perfiles ICC, lo que no tendría sentido para QPDF para expandirse).

Para volver a comprimir el expanded.pdfarchivo después de editarlo, puede ejecutar:

 qpdf expanded.pdf orig2.pdf

(¡Tenga cuidado al editar archivos PDF manualmente! Debe saber mucho acerca de su sintaxis interna para hacerlo correctamente. Tan pronto como agregue o elimine un solo byte, puede recibir mensajes de error de los lectores de PDF que quizás ya no puedan ábralo, porque el ToC interno de los archivos PDF está dañado, lo que se basa en cálculos de desplazamiento de bytes. Sin embargo, el reemplazo Fitpor XYZcadenas debería funcionar bien ...)

Kurt Pfeifle
fuente
1
También puede agregar o eliminar texto. Cuando la longitud de una secuencia de objetos cambia, los desplazamientos de bytes se pueden volver a calcular utilizando el fix-qdfprograma que forma parte de qpdf. Sin embargo, aún debes tener un poco de cuidado. Ver qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich
@ H.Rittich: Gracias por el comentario ... ¿De qué manera crees que esto abre una nueva perspectiva sobre el problema? ¿Crees que no sabemos que podemos agregar o eliminar texto de esta manera?
Kurt Pfeifle
@KursPfeifle: No hago suposiciones sobre lo que sabes. La respuesta indica que la edición de un PDF de esta manera necesita preservar los desplazamientos de bytes de los objetos en el archivo. Sin embargo, es posible cambiar los desplazamientos de bytes cuando luego los corrige utilizando fix-qdf. Por lo tanto, si desea reemplazar una cadena por una cadena de diferente longitud, es posible, pero debe usar la fix-qdfherramienta. Yo diría que esta es una adición útil a la respuesta.
H. Rittich
@ H.Rittich: Gracias por dar tu perspectiva. Cuando hice hincapié en la necesidad de preservar las compensaciones de bytes de objetos, no quise aconsejar a las personas sobre CÓMO deberían hacer esto. Si hubiera redactado su comentario de forma ligeramente diferente, habría entendido la intención de su comentario más rápido.
Kurt Pfeifle
1

sedestá orientado a líneas, lo que hace que no sea adecuado para archivos binarios, que están estructurados como bloques y no como líneas.
Intente usar bbe (bbe-.sourceforge.net) en su lugar.

Alternativamente, tanto Emacs (GNU y XEmacs) como vim abren archivos PDF sin problemas. No está muy bien impreso, por supuesto, ya que es texto mixto y binario, pero es suficiente para sus propósitos de edición.
Hay un complemento Pdftk para vim que hace que todo sea más fácil, descargue aquí (archivo zip).
Como probablemente sepa, los dos editores anteriores tienen potentes capacidades de búsqueda y reemplazo.

Además, convertir el PDF al modo QDF antes hace que la edición de archivos PDF sea realmente fácil.

Philomath
fuente
También puede intentar editar con sedel -binterruptor. si funciona, agregaré esto a mi respuesta.
Philomath
@Tim: ¿qué quieres decir con "no muestra nada", solo vacío? algun mensaje de error? Además, ¿puedes probar con XEmacs? (Los tres trabajaron para mí).
Philomath
No importa -b, es específico de Cygwin.
Philomath
Emacs dice "El archivo 1.pdf es grande (9MB), ¿realmente abierto? (Sí o no)". Elegí "y", y luego no hay nada allí.
Tim
Probablemente sea un problema de Emacs, ¿tienes XEmacs? (Acabo de abrir un PDF de 31 MB sin ningún problema).
Philomath
0

Use LibreOffice u OpenOffice para abrir el PDF, verlo, reemplazar cosas, escribir un nuevo PDF, etc. Creo que incluso puede usarlo desde la línea de comandos o mediante programación si hay muchos documentos para procesar.

Tenga en cuenta que los archivos PDF de algunas fuentes, por ejemplo, escáneres, a menudo contienen las páginas como imágenes en lugar de texto, por lo que no tendrá suerte con ellas al usar la búsqueda y el reemplazo.

Steve Barnes
fuente
3
(1/2) Tenga en cuenta el siguiente hecho: LibreOffice no es un editor de PDF nativo. Cuando abre un PDF, convierte todas las páginas en una imagen vectorial (que puede mantener las partes ráster del PDF original como partes ráster) y lo abre en la parte de LibreOffice Draw de la suite LibreOffice. Luego, cuando guarde el archivo PDF editado, será un archivo PDF que se exportó del formato nativo de LibreOffice Draw (con el sufijo .odg ) a PDF.
Kurt Pfeifle
3
(2/2) Este flujo de trabajo puede tener efectos secundarios inesperados. Además, es posible que la aplicación LibreOffice Draw no pueda importar correctamente todos los elementos del PDF original. Sin embargo, en muchos casos aún puede ser una herramienta útil para todas aquellas personas que no tienen mejores medios disponibles.
Kurt Pfeifle