web-dev-qa-db-fra.com

Outil de ligne de commande pour rechercher et remplacer du texte sur un PDF

J'ai un PDF qui porte mon nom sous la forme d'un filigrane odieux dans un fichier assez long PDF. J'ai essayé de remplacer le texte dans LibreOffice Draw par des blancs, mais bien que mon nom apparaisse sous forme de texte, la fonction de recherche et remplacement semble surcharger mon ordinateur en prenant beaucoup de RAM et de temps de calcul.

Existe-t-il un moyen en ligne de commande pour supprimer les chaînes de PDF? Hmm ... est-ce que sed peut le faire?

4
j0h

Comme dans de nombreux cas, il ne s’agit que de texte, vous pouvez souvent le supprimer simplement avec sed ou en fait n’importe quel éditeur de texte - disons qu’il est écrit "filigrane":

sed 's/watermark//g' in.pdf >out.pdf

Si votre fichier PDF est compressé, cela ne fonctionne pas, vous devez d'abord le décompresser, par exemple. avec pdftk ( Comment puis-je installer pdftk dans Ubuntu 18.04 et versions ultérieures? ):

pdftk in.pdf output out.pdf uncompress 

Si la sortie de sed ’n’est pas lisible avec votre lecteur préféré PDF, essayez de la réparer avec pdftk:

pdftk out.pdf output out_pdftk.pdf

Lectures supplémentaires: Comment éditer des PDF?

Source: Comment supprimer un filigrane d'un fichier PDF à l'aide de pdftk • Super User

7
dessert

Réponse acceptée ne fonctionnera que dans de rares cas

Désolé, la réponse donnée par @dessert est aussi fausse que cela pourrait être un conseil général. Cela ne fonctionnera pas dans le cas général du remplacement de texte dans les PDF (en filigranes ou non), et vous devrez être très chanceux pour les très rares cas de PDF que vous rencontriez s'il fonctionnerait. (De plus, les filigranes insérés par LibreOffice sont fréquemment convertis en graphiques vectoriels ou en pixels, même s'ils apparaissent comme du texte lorsqu'ils sont imprimés ou visualisés à l'écran .... mais je ne discuterai pas de ce cas plus loin - ci-dessous, je traite uniquement du contenu de texte réel dans un PDF.)

Les raisons

Les raisons en sont les suivantes:

  1. Ce qui apparaît comme un texte ASCII dans la représentation visuelle de son contenu dans un visualiseur PDF, très probable ne sera pas ASCII texte dans le code source PDF. Au lieu de cela, il peut être codé en hexadécimal.

  2. De plus, les caractères individuels d'une chaîne ASCII peuvent être placés sur la page dans un ordre consécutif, mais ils peuvent également être placés individuellement, chacun ayant sa propre information de coordonnées parsemée entre les caractères individuels ...

  3. En outre, le codage hexadécimal de la table de caractères ASCII (et non-ASCII) (le "mappage") ne sera pas prévisible et il peut changer d'une police à l'autre.

Par conséquent, dans tous ces cas, votre commande sed ne réussira pas, pas même après la décompression du fichier PDF.

Exemple

Voici un exemple pour la "chaîne" Watermark , comment elle peut apparaître dans un PDF créé avec LibreOffice:

56.8 726.989 Td /F2 16 Tf[<01>29<0203>-2<0405>6<06>-1<020507>]TJ

Je vais disséquer pour vous ce que cela signifie:

  • 56.8 726.989 Td: Td est un opérateur permettant de déplacer le positionnement du texte sur la page. 56.8 726.989 sont les coordonnées x/y pour décrire cette position exacte.

  • /F2 16 Tf: Tf est un opérateur permettant de définir une police donnée ainsi que sa taille en tant que police active; dans ce cas, c'est la police étiquetée ailleurs avec le nom /F2 et sa taille doit être 16 pt.

  • [<01>29<0203>-2<0405>6<06>-1<020507>]TJ: TJ est un opérateur permettant d'afficher du texte tout en permettant le positionnement individuel des glyphes. La signification des extraits hexadécimaux encadrés par des crochets est la suivante, selon le tableau 'charmap' spécifique à ce PDF et à la police utilisée:

    • <01>: il s'agit du 'W'.

    • <0203>: il s'agit du 'at'.

    • <0405>: il s'agit du 'er'.

    • <06>: il s'agit du 'm'.

    • <020507>: il s'agit du 'ark'.

    Les nombres entre ces extraits hexadécimaux (29, -2, 6 et -1) sont des valeurs de correction qui déterminent les espacements individuels des différents caractères.

Maintenant vous me montrez comment remplacer cette "chaîne" par autre chose en utilisant sed ... Souvenez-vous que vous ne connaissez pas l'encodage à l'avance. , ni les numéros de correction d’emplacement, lorsque vous traitez avec un PDF arbitraire. Vous ne pouvez le savoir qu'en ouvrant son code source dans un éditeur et en analysant son contenu.

Résumé

Non, il n'y a pas de moyen en ligne de commande pour supprimer de manière fiable les chaînes indésirables d'un fichier PDF!

Vous ne pouvez le faire que si ...

(a) ... vous êtes un PDF expert ayant les compétences nécessaires pour lire le code source PDF;

(b) ... vous êtes prêt à analyser le fichier PDF en question individuellement;

(c) ... vous utilisez un éditeur de texte pour modifier son contenu après avoir décompressé le code source PDF.

AVERTISSEMENT: La réponse actuellement marquée comme "acceptée" aurait peut-être fonctionné pour le PDF du OP. Cependant, cela ne fonctionnera pas dans le cas général. Ne prenez pas la "recette", il annonce pour acquis!

4
Kurt Pfeifle