Meilleur outil pour inspecter les fichiers PDF? [fermé]

91

Quel outil recommandez-vous pour inspecter les fichiers PDF?

Cas d'utilisation: j'essaie de générer des fichiers PDF par programmation (en utilisant iText). J'ai du mal à réaliser certaines mises en page, mais j'ai des fichiers PDF avec du texte disposé comme je le souhaite (généré à partir de Word). Je voudrais faire de l'ingénierie inverse sur la façon dont ils le font.

PDF Inspector semble être bon, mais je cherche quelque chose pour Windows.

bmm6o
la source
PDF Inspector est basé sur Java, donc multiplateforme.
david.perez
2
Cependant, il ne semble pas fonctionner sous Windows. Le pot ne fait rien lorsqu'on clique dessus. Lorsqu'il est appelé sur la ligne de commande, je reçoisno main manifest attribute, in PDF Document Inspector.jar
Tom
@ david.perez est basé sur Java mais enveloppé de pomme, donc c'est un peu une distribution uniquement Apple. Il existe un fichier jar "PDF Document Inspector.app/Contents/Resources/Java/PDF Document Inspector.jar" mais il ne peut pas être démarré en java -jar "PDF Document Inspector.jar" Il y a aussi beaucoup de com.apple.cocoa. * Comprend qui sont spécifiques à la plate-forme. :(
andrej
J'utilise maintenant avec succès iText Rups, multiplateforme et basé sur Java.
david.perez

Réponses:

18

Adobe Acrobat a un mode très cool mais plutôt bien caché vous permettant d'inspecter les fichiers PDF. J'ai écrit un article de blog expliquant cela à https://blog.idrsolutions.com/2009/04/viewing-pdf-objects/

marque stephens
la source
Cela semble nécessiter un plugin; au moins, il n'est pas disponible dans Acrobat Reader 9.5.5 sous Linux.
Adam Spiers
3
@AdamSpiers, la boîte de dialogue de contrôle en amont est une fonctionnalité d'Adobe Acrobat, pas d'Adobe Reader
IPSUS
... et Acrobat ( anciennement Acrobat Exchange ) n'est pas disponible pour Linux: - /
Adam Spiers
7
La boîte de dialogue de contrôle en amont nécessite en fait Adobe Acrobat Pro. Il n'est pas disponible dans Adobe Acrobat Standard.
Futal
1
Et c'est un cauchemar d'interface utilisateur à utiliser.
Jon
83

Outre les outils basés sur l'interface graphique mentionnés dans les autres réponses, il existe quelques outils de ligne de commande qui peuvent transformer le code source PDF d'origine en une représentation différente qui vous permet d'inspecter le (fichier maintenant modifié) avec un éditeur de texte. Tous les outils ci-dessous fonctionnent sur Linux, Mac OS X, d'autres systèmes Unix ou Windows.

qpdf (mon préféré)

Utilisez qpdf pour décompresser (la plupart) les flux d' ObjStmobjets et disséquer également les objets en objets indirects individuels:

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

qpdfse décrit comme un outil qui effectue des "transformations structurelles, préservant le contenu des fichiers PDF" .

Ensuite, ouvrez simplement + inspectez le uncompressed-qpdf.pdffichier dans votre éditeur de texte préféré. La plupart des octets précédemment compressés (et donc binaires) seront désormais du texte brut.

mutool

Il existe également l' mutooloutil de ligne de commande fourni avec la visionneuse PDF MuPDF (qui est un produit frère de Ghostscript, fabriqué par la même société, Artifex ). La commande suivante décompresse également les flux et les rend plus faciles à inspecter via un éditeur de texte:

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

podofouncompress

PoDoFo est une bibliothèque FreeSoftware / OpenSource pour travailler avec le format PDF et elle comprend quelques outils de ligne de commande, y comprispodofouncompress. Utilisez-le comme ceci pour décompresser les flux PDF:

podofouncompress orig.pdf uncompressed-podofo.pdf

peepdf.py

PeePDF est un outil basé sur Python qui vous aide à explorer les fichiers PDF. Son objectif initial était la recherche et la dissection de logiciels malveillants basés sur PDF, mais je trouve également utile d'étudier la structure de fichiers PDF complètement inoffensifs.

Il peut être utilisé de manière interactive pour «parcourir» les objets et les flux contenus dans un PDF.

Je ne donnerai pas d'exemple d'utilisation ici, mais seulement un lien vers sa documentation:

pdfid.py et pdf-parser.py

pdfid.pyet pdf-parser.pysont deux outils PDF de Didier Stevens écrits en Python.

Leur expérience est également d'aider à explorer les fichiers PDF malveillants - mais je trouve également utile d'analyser la structure et le contenu des fichiers PDF bénins.

Voici un exemple comment extraire le flux non compressé de l'objet PDF no. 5 dans un fichier * .dump:

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

Notes finales

  1. Veuillez noter que certaines parties binaires d'un PDF ne sont pas nécessairement incompressibles (ou décodables en code ASCII lisible par l'homme), car elles sont incorporées et utilisées dans leur format natif dans les PDF. Ces parties PDF sont des images JPEG, des polices ou des profils de couleurs ICC.

  2. Si vous comparez les outils ci-dessus et les exemples de ligne de commande donnés, vous découvrirez qu'ils ne produisent PAS tous des sorties identiques. L'effort de les comparer pour leurs différences en soi peut vous aider à mieux comprendre la nature de la syntaxe et du format de fichier PDF.

Kurt Pfeifle
la source
42

J'utilise iText RUPS (Reading and PDF Syntax) sous Linux. Comme il est écrit en Java, il fonctionne également sous Windows. Vous pouvez parcourir tous les objets du fichier PDF dans une arborescence. Il peut également décoder à la volée les flux encodés Flate pour faciliter l'inspection.

Voici une capture d'écran:

Capture d'écran iText RUPS

gkcn
la source
9
java -jar itext-rups-5.5.6.jar-> Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/itextpdf/text/Version- Comment êtes-vous censé gérer cette chose? Edit: compris. Vous ne devez pas télécharger le fichier par défaut proposé par SourceForge, vous devez télécharger le .jar qui inclut les dépendances.
Zero3
2
@ Zero3 vient de tomber sur la même chose. Merci pour votre commentaire.
Sam
1
@KurtPfeifle Je suis entièrement d'accord. Malheureusement, beaucoup de logiciels (comme celui-ci!) Ne sont disponibles que via SourceForge parce que le responsable n'a pas encore déplacé le projet ailleurs, et pourrait ne jamais le faire. Vous devriez en effet être très prudent lorsque vous téléchargez quoi que ce soit à partir de SourceForge ces jours-ci ...
Zero3
7
Oui - en tant que jar compilé et même en tant qu'exe, pour les utilisateurs de Windows. Voir github.com/itext/rups/releases/latest
Amedee Van Gasse
1
@AmedeeVanGasse la capture d'écran de cette réponse montre une vue de la page (entre l'arborescence du document et l'onglet xréf). Comment puis-je afficher cette vue dans la version 5.5.9 sous Windows?
iPDFdev
5

J'ai utilisé PDFBox avec un bon succès. Voici un exemple de ce à quoi ressemble le code (de retour de la version 0.7.2), qui provient probablement de l'un des exemples fournis:

// 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
la source
3

La visionneuse d'objets dans Acrobat est bonne, mais PDF Canopener de Windjack Solution permet une meilleure inspection avec une pipette pour sélectionner les objets sur la page. Permet également d'apporter des modifications au PDF.

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

Dwight Kelly
la source
3

Il existe également une autre option. Adobe Acrobat Pro est également capable d'afficher l'arborescence interne du PDF.

  1. Contrôle en amont ouvert
  2. Allez dans Options (coin supérieur droit)
  3. Structure PDF interne

En plus, Adobe Acrobat Pro peut également afficher la structure interne des polices de document dans le PDF, la plupart des autres "visionneuses d'arborescence PDF" n'ont pas cette otion

entrez la description de l'image ici

Vadimo
la source
2
C'est ce que @ mark-stephens décrit dans la réponse acceptée.
koppor
3
La réponse de @ mark-stephens ne fait que des liens vers un article de blog qui pourrait disparaître à l'avenir (et est découragé sur SO). vadimo fournit en fait la réponse.
Starfish
1

Si vous souhaitez travailler par programmation à partir de Python, pdfminer est une bonne option. Il vous permet de travailler avec la structure PDF en mémoire en tant que hiérarchie d'objets ou de la sérialiser en XML.

WP McNeill
la source
-6

Ma suggestion est Foxit PDF Reader, qui est très utile pour effectuer d'importants travaux d'édition de texte sur un fichier pdf.

nifCody
la source
6
Je n'ai trouvé aucun moyen dans Foxit Reader d'afficher la structure interne d'un PDF similaire à PDF Inspector (référencé dans la question)
bmaupin