¿La mejor herramienta para inspeccionar archivos PDF? [cerrado]

94

¿Cómo puedo inspeccionar archivos PDF, preferiblemente con una herramienta?

Caso de uso: estoy tratando de generar archivos PDF mediante programación (usando iText). Tengo problemas para lograr ciertos diseños, pero tengo archivos PDF con el texto distribuido de la manera que quiero (generado a partir de Word). Me gustaría aplicar ingeniería inversa a cómo lo hacen.

PDF Inspector parece estar bien, pero estoy buscando algo para Windows.

bmm6o
fuente
PDF Inspector está basado en Java, por lo que es multiplataforma.
david.perez
2
Sin embargo, no parece ejecutarse en Windows. El frasco no hace nada cuando se hace clic en él. Cuando se me llama en la línea de comando, obtengono main manifest attribute, in PDF Document Inspector.jar
Tom
1
@ david.perez está basado en Java pero envuelto en Apple, por lo que es una especie de distribución única de Apple. Hay "PDF Document Inspector.app/Contents/Resources/Java/PDF Document Inspector.jar" jar pero no se puede iniciar como java -jar "PDF Document Inspector.jar" También hay mucho com.apple.cocoa. * Incluye que son específicos de la plataforma. :(
andrej
Estoy usando ahora con éxito iText Rups, multiplataforma y basado en Java.
david.perez

Respuestas:

18

Adobe Acrobat tiene un modo genial pero bastante bien oculto que le permite inspeccionar archivos PDF. Escribí un artículo de blog explicándolo en https://blog.idrsolutions.com/2009/04/viewing-pdf-objects/

Mark Stephens
fuente
Esto parece requerir un complemento; al menos no está disponible en Acrobat Reader 9.5.5 en Linux.
Adam Spiers
3
@AdamSpiers, el cuadro de diálogo de verificación previa es una función de Adobe Acrobat, no de Adobe Reader
IPSUS
... y Acrobat ( anteriormente Acrobat Exchange ) no está disponible para Linux: - /
Adam Spiers
7
El cuadro de diálogo Preflight realmente requiere Adobe Acrobat Pro. No está disponible en Adobe Acrobat Standard.
Futal
1
Y es una pesadilla usar la interfaz de usuario.
Jon
87

Además de las herramientas basadas en GUI mencionadas en las otras respuestas, hay algunas herramientas de línea de comandos que pueden transformar el código fuente PDF original en una representación diferente que le permite inspeccionar el (archivo ahora modificado) con un editor de texto. Todas las herramientas siguientes funcionan en Linux, Mac OS X, otros sistemas Unix o Windows.

qpdf (mi favorito)

Use qpdf para descomprimir (la mayoría) de los flujos de ObjStmobjetos y también diseccionar objetos en objetos indirectos individuales:

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

qpdfse describe a sí misma como una herramienta que realiza "transformaciones estructurales que preservan el contenido en archivos PDF" .

Luego, simplemente abra + inspeccione el uncompressed-qpdf.pdfarchivo en su editor de texto favorito. La mayoría de los bytes previamente comprimidos (y por lo tanto, binarios) ahora serán texto sin formato.

mutool

También existe la mutoolherramienta de línea de comandos que viene incluida con el visor de PDF MuPDF (que es un producto hermano de Ghostscript, fabricado por la misma compañía, Artifex ). El siguiente comando también descomprime los flujos y los hace más fáciles de inspeccionar a través de un editor de texto:

mutool clean -d orig.pdf uncompressed-mutool.pdf

podofouncompress

PoDoFo es una biblioteca FreeSoftware / OpenSource para trabajar con el formato PDF e incluye algunas herramientas de línea de comandos, incluidaspodofouncompress. Úselo así para descomprimir flujos de PDF:

podofouncompress orig.pdf uncompressed-podofo.pdf

peepdf.py

PeePDF es una herramienta basada en Python que le ayuda a explorar archivos PDF. Su propósito original era la investigación y disección de malware basado en PDF, pero también lo encuentro útil para investigar la estructura de archivos PDF completamente benignos.

Se puede utilizar de forma interactiva para "examinar" los objetos y las secuencias contenidos en un PDF.

No daré un ejemplo de uso aquí, sino solo un enlace a su documentación:

pdfid.py y pdf-parser.py

pdfid.pyy pdf-parser.pyson dos herramientas PDF de Didier Stevens escritas en Python.

Su experiencia también es ayudar a explorar archivos PDF maliciosos , pero también me resulta útil analizar la estructura y el contenido de archivos PDF benignos.

Aquí hay un ejemplo de cómo extraería el flujo sin comprimir del objeto PDF no. 5 en un archivo * .dump:

pdf-parser.py -o 5 -f -d obj5.dump my.pdf

Notas finales

  1. Tenga en cuenta que algunas partes binarias dentro de un PDF no son necesariamente incompresibles (o decodificables en código ASCII legible por humanos), porque están incrustadas y utilizadas en su formato nativo dentro de los PDF. Estas partes de PDF son imágenes JPEG, fuentes o perfiles de color ICC.

  2. Si compara las herramientas anteriores y los ejemplos de la línea de comandos dados, descubrirá que NO todas producen resultados idénticos. El esfuerzo de compararlos por sus diferencias en sí mismo puede ayudarlo a comprender mejor la naturaleza de la sintaxis y el formato de archivo PDF.

Kurt Pfeifle
fuente
42

Utilizo iText RUPS (lectura y actualización de la sintaxis de PDF) en Linux. Dado que está escrito en Java, también funciona en Windows. Puede examinar todos los objetos del archivo PDF en una estructura de árbol. También puede decodificar transmisiones codificadas con Flate sobre la marcha para facilitar la inspección.

Aquí hay una captura de pantalla:

Captura de pantalla de iText RUPS

gkcn
fuente
9
java -jar itext-rups-5.5.6.jar-> Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/itextpdf/text/Version- ¿Cómo se supone que vas a ejecutar esto? Editar: lo descubrí. No debe descargar el archivo predeterminado ofrecido por SourceForge, necesita descargar el .jar que incluye dependencias.
Zero3
2
@ Zero3 acaba de encontrar lo mismo. Gracias por tu comentario.
Sam
1
@KurtPfeifle Estoy completamente de acuerdo. Desafortunadamente, una gran cantidad de software (¡como este!) Solo está disponible a través de SourceForge porque el mantenedor aún no movió el proyecto a otro lugar y es posible que nunca lo haga. De hecho, debe tener mucho cuidado al descargar algo de SourceForge en estos días ...
Zero3
7
Sí, como jar compilado e incluso como exe, para usuarios de Windows. Ver github.com/itext/rups/releases/latest
Amedee Van Gasse
1
@AmedeeVanGasse la captura de pantalla en esta respuesta muestra una vista de la página (entre el árbol del documento y la pestaña xref). ¿Cómo puedo mostrar esa vista en v5.5.9 en Windows?
iPDFdev
5

He utilizado PDFBox con mucho éxito. Aquí hay una muestra de cómo se ve el código (desde la versión 0.7.2), que probablemente provino de uno de los ejemplos proporcionados:

// load the document
System.out.println("Reading document: " + filename);
PDDocument doc = null;                                                                                                                                                                                                          
doc = PDDocument.load(filename);

// look at all the document information
PDDocumentInformation info = doc.getDocumentInformation();
COSDictionary dict = info.getDictionary();
List l = dict.keyList();
for (Object o : l) {
    //System.out.println(o.toString() + " " + dict.getString(o));
    System.out.println(o.toString());
}

// look at the document catalog
PDDocumentCatalog cat = doc.getDocumentCatalog();
System.out.println("Catalog:" + cat);

List<PDPage> lp = cat.getAllPages();
System.out.println("# Pages: " + lp.size());
PDPage page = lp.get(4);
System.out.println("Page: " + page);
System.out.println("\tCropBox: " + page.getCropBox());
System.out.println("\tMediaBox: " + page.getMediaBox());
System.out.println("\tResources: " + page.getResources());
System.out.println("\tRotation: " + page.getRotation());
System.out.println("\tArtBox: " + page.getArtBox());
System.out.println("\tBleedBox: " + page.getBleedBox());
System.out.println("\tContents: " + page.getContents());
System.out.println("\tTrimBox: " + page.getTrimBox());
List<PDAnnotation> la = page.getAnnotations();
System.out.println("\t# Annotations: " + la.size());
Kaleb Pederson
fuente
4

También hay otra opción. Adobe Acrobat Pro también puede mostrar la estructura de árbol interna del PDF.

  1. Abrir Preflight
  2. Vaya a Opciones (esquina superior derecha)
  3. Estructura interna de PDF

En la parte superior, Adobe Acrobat Pro también puede mostrar la estructura interna de las fuentes del documento en el PDF, la mayoría de los demás "visores de estructura de árbol de PDF" no tienen esta opción.

ingrese la descripción de la imagen aquí

Vadimo
fuente
2
Esto es lo que describe @ mark-stephens en la respuesta aceptada.
koppor
3
La respuesta de @ mark-stephens solo se vincula a una publicación de blog que podría desaparecer en el futuro (y se desaconseja en SO). vadimo's realmente proporciona la respuesta.
Starfish
3

El visor de objetos en Acrobat es bueno, pero PDF Canopener de Windjack Solution permite una mejor inspección con un cuentagotas para seleccionar objetos en la página. También permite realizar modificaciones en PDF.

http://www.windjack.com/products/pdfcanopener.html

Dwight Kelly
fuente
1

Si desea trabajar mediante programación desde Python, pdfminer es una buena opción. Le permite trabajar con la estructura de PDF en la memoria como una jerarquía de objetos o serializarla como XML.

WP McNeill
fuente
-6

Mi sugerencia es Foxit PDF Reader, que es muy útil para realizar trabajos importantes de edición de texto en archivos PDF.

nifCody
fuente
6
No pude encontrar ninguna forma en Foxit Reader para ver la estructura interna de un PDF similar a PDF Inspector (al que se hace referencia en la pregunta)
bmaupin