Comment afficher et modifier le code d'un fichier PDF

12

Je me demandais comment afficher et modifier le code d'un fichier PDF?

  1. En visionnant, je ne veux pas voir le format binaire, donc je pense que ce hexdumpn'est peut-être pas ce que je veux. J'ai essayé gedit, mais aucune méthode de codage ne peut être utilisée pour décoder le contenu PDF.

  2. En les éditant, je voudrais les rechercher /Fitet les changer /XYZpar exemple par sed. Mais ma commande sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfne semble pas changer l'apparence de mon PDF comme je m'y attendais, bien qu'elle ne signale aucune erreur. Je me demandais si je pouvais sedvraiment travailler sur des fichiers PDF comme s'ils étaient en texte brut?

Le contexte de mes questions se trouve à partir de cette question . Mon système d'exploitation est Ubuntu 10.10.

Tim
la source

Réponses:

9

Vous pouvez l'utiliser sedavec des fichiers binaires (au moins GNU sed; certaines implémentations peuvent avoir des problèmes avec des fichiers contenant des caractères nuls ou ne se terminant pas par un caractère de nouvelle ligne). Mais la commande que vous avez utilisée ne remplace que la première occurrence de /Fitsur chaque ligne, et les lignes sont à peu près dénuées de sens dans un fichier PDF. Vous devez remplacer toutes les occurrences:

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

Il serait plus robuste de ne remplacer que /Fits'il n'est pas suivi par un mot constituant (par exemple, ne pas remplacer /Fitness; je ne sais pas si votre fichier contient des occurrences /Fitqui causeraient des problèmes). Voici une façon:

perl -pe 's!/Fit\b!/XYZ!g'
Gilles 'SO- arrête d'être méchant'
la source
Merci! Ça marche maintenant! (1) Je me demandais comment sed cherchait les caractères dans le contenu binaire? Sed encode-t-il d'abord les caractères de la requête avant la recherche? (2) Dans la dernière commande, qu'est-ce !, \bet gveut dire? Peut-on le faire sans perl juste avec sed?
Tim
1
@Tim (1) Sed charge les données en mémoire, les opère et les imprime. Pourquoi aurait-il besoin d'encoder quoi que ce soit? (2) gsignifie remplacer toutes les occurrences sur chaque ligne, en sed et en perl. !est le séparateur; vous pouvez choisir (presque) n'importe quel caractère comme séparateur de la scommande (cela va à la fois dans sed et perl). \bsignifie une limite de mot; il existe en perl mais pas en sed.
Gilles 'SO- arrête d'être méchant'
À propos de (1), car les caractères que vous donnez à sed dans la commande sont lisibles par l'homme. Si le contenu à rechercher est complètement binaire, comment sed peut-il y trouver le mot de requête?
Tim
@Tim Text est une donnée binaire qui se trouve être lisible par l'homme.
Gilles 'SO- arrête d'être méchant'
1
@Tim Oui, vous pouvez transmettre des données binaires dans la requête. Vous devrez insérer les caractères littéralement dans votre code source sed ou shell.
Gilles 'SO- arrête d'être méchant'
17

Concernant votre 1ère question ("visualisation du code source, mais pas de binaire"): vous disposez de quelques options pour décompresser les flux binaires internes attachés à de nombreux objets.

Mon outil préféré pour cela est QPDF , disponible sur toutes les principales plates-formes OS. La commande suivante décompresse tous les flux et tous les flux d'objets:

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

Vous pouvez maintenant ouvrir votre PDF dans n'importe quel éditeur de texte. (Il peut encore y avoir des objets binaires binaires: par exemple, des fichiers de polices et des profils ICC, ce qui n'aurait pas de sens pour QPDF de se développer).

Pour recompresser àexpanded.pdf nouveau le fichier après l'édition, vous pouvez exécuter:

 qpdf expanded.pdf orig2.pdf

(Attention lors de l'édition manuelle de PDF! Vous devez en savoir beaucoup sur leur syntaxe interne pour le faire correctement. Dès que vous ajoutez ou supprimez un seul octet, vous pouvez obtenir des messages d'erreur de lecteurs PDF qui ne pourront plus ouvrir, parce que les fichiers PDF TdC interne est corrompu, qui est basé sur des calculs décalage d' octet. il suffit de remplacer Fitpar des XYZcordes devrait aller bien, mais ...)

Kurt Pfeifle
la source
1
Vous pouvez également ajouter ou supprimer du texte. Lorsque la longueur d'un flux d'objets change, les décalages d'octets peuvent être recalculés en utilisant le fix-qdfprogramme qui fait partie de qpdf. Il faut quand même être un peu prudent. Voir qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich
@ H.Rittich: Merci pour le commentaire ... En quoi pensez-vous que cela ouvre une nouvelle perspective sur le problème? Pensiez-vous que nous ne savons pas que nous pouvons ajouter ou supprimer du texte de cette façon?
Kurt Pfeifle
@KursPfeifle: Je ne fais aucune hypothèse sur ce que vous savez. La réponse indique que la modification d'un PDF de cette manière doit préserver les décalages d'octets des objets dans le fichier. Il est cependant possible de modifier les décalages d'octets lors de leur correction ultérieure à l'aide de fix-qdf. Par conséquent, si vous souhaitez remplacer une chaîne par une chaîne de longueur différente, c'est possible, mais vous devez utiliser l' fix-qdfoutil. Je dirais que c'est un ajout utile à la réponse.
H.Rittich
@ H.Rittich: Thx pour avoir donné votre point de vue. Quand je l' ai souligné la nécessité de préserver des décalages d'octets d'objets que je ne voulais pas les gens de conseils sur COMMENT ils devraient le faire. Si vous aviez formulé votre commentaire légèrement différemment, j'aurais compris plus rapidement l'intention de votre commentaire.
Kurt Pfeifle
1

sedest orienté ligne, ce qui le rend peu adapté aux fichiers binaires, qui sont structurés en blocs et non en lignes.
Essayez plutôt d'utiliser bbe (bbe-.sourceforge.net).

Alternativement, Emacs (GNU et XEmacs) et vim ouvrent des fichiers PDF de manière transparente. Ce n'est pas très joli, bien sûr, car il s'agit d'un texte mixte et binaire, mais c'est suffisant pour vos besoins d'édition.
Il existe un plugin Pdftk pour vim qui facilite tout, téléchargez ici (fichier zip).
Comme vous le savez probablement, les deux éditeurs ci-dessus ont de puissantes capacités de recherche et de remplacement.

De plus, la conversion du PDF en mode QDF avant facilite la modification des fichiers PDF.

Philomath
la source
Vous pouvez également essayer de modifier en sedutilisant le -bcommutateur. si cela fonctionne, j'ajouterai ceci à ma réponse.
Philomath
@Tim: que voulez-vous dire par "ne montre rien", juste vide? un message d'erreur? Pouvez-vous également essayer avec XEmacs? (tous les trois ont travaillé pour moi).
Philomath
Peu importe -b, c'est spécifique à cygwin.
Philomath
Emacs dit "Le fichier 1.pdf est volumineux (9 Mo), vraiment ouvert? (Y ou n)". J'ai choisi "y", puis rien n'est là.
Tim
Très probablement un problème Emacs, avez-vous des XEmacs? (Je viens d'ouvrir un PDF de 31 Mo sans aucun problème).
Philomath
0

Utilisez LibreOffice ou OpenOffice pour ouvrir le PDF, le visualiser, remplacer des choses, écrire un nouveau PDF, etc. Je pense que vous pouvez même l'utiliser à partir de la ligne de commande ou par programme s'il y a beaucoup de documents à traiter.

Notez que les fichiers PDF de certaines sources, par exemple les scanners, contiennent souvent les pages sous forme d'images plutôt que sous forme de texte, vous n'aurez donc pas de chance avec elles pour utiliser la recherche et le remplacement.

Steve Barnes
la source
3
(1/2) Soyez conscient du fait suivant: LibreOffice n'est pas un éditeur PDF natif. Lorsqu'il ouvre un PDF, il convertit toutes les pages en une image vectorielle (qui peut conserver les parties raster du PDF d'origine en tant que parties raster) et l'ouvre dans la partie LibreOffice Draw de la suite LibreOffice. Ensuite, lorsqu'il enregistre le fichier PDF édité, ce sera un fichier PDF qui a été exporté du format natif LibreOffice Draw (avec le suffixe .odg ) au format PDF.
Kurt Pfeifle
3
(2/2) Ce flux de travail peut avoir des effets secondaires inattendus. De plus, l'application LibreOffice Draw peut ne pas être en mesure d'importer correctement tous les éléments du PDF d'origine. Cependant, dans de nombreux cas, il peut encore être un outil utile pour tous ceux qui n'ont pas de meilleurs moyens disponibles.
Kurt Pfeifle