Ajouter et modifier des signets au format PDF

22

En obtenant des métadonnées à partir de certains fichiers pdf avec des signets par pdftk, j'observe le format des signets dans les métadonnées pdf. Je suppose donc qu'avec pdftk, il est possible d'ajouter et de modifier les signets d'un fichier pdf.

Voici trois étapes que je suis:

  1. J'obtiens d'abord les métadonnées (y compris les signets, le cas échéant) d'un fichier pdf dans un fichier texte par pdftk in.pdf dump_data > in.info.
  2. J'ajoute ensuite des signets dans le fichier texte des métadonnées in.info, en le changeant de

    InfoKey: Creator
    InfoValue: PScript5.dll Version 5.2
    InfoKey: Title
    InfoValue: SSReader Print.
    InfoKey: Producer
    InfoValue: Acrobat Distiller 7.0 (Windows)
    InfoKey: Author
    InfoValue: Administrator
    InfoKey: ModDate
    InfoValue: D:20050605073244+08'00'
    InfoKey: CreationDate
    InfoValue: D:20050605073244+08'00'
    PdfID0: 591a87c91dc76881fdf2ccf3811e72a5
    PdfID1: 6b6ab11de8824e438e4f5eb1d85ec72
    NumberOfPages: 400
    PageLabelNewIndex: 1
    PageLabelStart: 1
    PageLabelNumStyle: DecimalArabicNumerals
    

    à

    InfoKey: Creator
    InfoValue: PScript5.dll Version 5.2
    InfoKey: Title
    InfoValue: SSReader Print.
    InfoKey: Producer
    InfoValue: Acrobat Distiller 7.0 (Windows)
    InfoKey: Author
    InfoValue: Administrator
    InfoKey: ModDate
    InfoValue: D:20050605073244+08'00'
    InfoKey: CreationDate
    InfoValue: D:20050605073244+08'00'
    PdfID0: 591a87c91dc76881fdf2ccf3811e72a5
    PdfID1: 6b6ab11de8824e438e4f5eb1d85ec72
    NumberOfPages: 400
    BookmarkBegin
    BookmarkTitle: Front cover
    BookmarkLevel: 1
    BookmarkPageNumber: 1
    BookmarkBegin
    BookmarkTitle: About the Author
    BookmarkLevel: 1
    BookmarkPageNumber: 5
    BookmarkBegin
    BookmarkTitle: Title page
    BookmarkLevel: 1
    BookmarkPageNumber: 6
    BookmarkBegin
    BookmarkTitle: Copyright page
    BookmarkLevel: 1
    BookmarkPageNumber: 7
    BookmarkBegin
    BookmarkTitle: Foreword
    BookmarkLevel: 1
    PageLabelNewIndex: 1
    PageLabelStart: 1
    PageLabelNumStyle: DecimalArabicNumerals
    
  3. Ensuite, j'essaie de remettre les métadonnées éditées dans le fichier pdf par pdftk in.pdf update_info in.info output out.pdf.

Mais lorsque j'ouvre le nouveau fichier pdf out.pdfdans evince ou adobe reader, il n'y a pas de signet dans le nouveau fichier pdf.

Si je reçois les métadonnées du nouveau fichier pdf out.pdfpar pdftk out.pdf dump_data > out.info, il n'y aura pas de signets dans out.info. Il semble que les signets n'aient pas été ajoutés avec succès.

Je me demandais s'il y avait des erreurs? Comment dois-je ajouter et modifier les signets d'un fichier pdf, pas nécessairement par pdftk?

Tim
la source
1
Ce petit outil graphique a fonctionné pour moi. (PDF Mod 0.9.1) apps.fedoraproject.org/packages/pdfmod
abhijit

Réponses:

12

Il me semble que depuis la version 1.45 (2012-12-06), pdftk autorise la modification des signets via la commande update_info:

Vous pouvez désormais ajouter ou modifier les signets d'un PDF à l'aide de update_info.

via: http://www.pdflabs.com/docs/pdftk-version-history/

user37186
la source
3
Cela a très bien fonctionné pour moi. Il faut ajouter que dans le fichier d'entrée au-dessus des BookmarkBeginbalises avant que chaque entrée de signet soit manquante.
danielp
4

jPDFtweak (Java, donc fonctionne sur Unix / Linux) peut modifier les signets, mais je ne sais pas si vous pouvez écrire quoi que ce soit avec.

Pour les scripts, je suppose que votre seule option Unix / Linux native serait pdflatex avec le paquet pdfpages. Mais c'est une courbe d'apprentissage si vous n'êtes pas déjà un utilisateur de LaTeX.

EDIT: En fait, cela peut être possible avec ghostscript: Voir ici ou ici ou ici

frabjous
la source
4

Si vous vous en tenez toujours à ces scripts Unix, alors

  1. extraire les données des signets sous-évaluées pdftk
  2. écrire un script supplémentaire pour convertir les données de signet vidées au format pdfmarks, qui commande ghostscript gs est acceptée.
  3. utiliser un gsscript pour les fusionner avec pdfmarks

Jetez un œil à http://blog.tremily.us/posts/PDF_bookmarks_with_Ghostscript/ le script pdf-merge.pyfait exactement ce que vous (ou moi) voulez.

pdf-merge.py --output=merged.pdf input1.pdf input2.pdf

Quelques améliorations mineures pourraient être apportées à son script

  1. gestion unicode
  2. produire des fichiers de signets afin que les utilisateurs puissent également les ajuster

Quoi qu'il en soit, cela devrait fonctionner

larrycai
la source
Un vote positif! Merci! J'attends votre script avec impatience!
Tim
Il semble que le lien ne fonctionne pas. Pouvez-vous le réparer s'il vous plaît?
Fish Monitor
4

pdftk est définitivement le bon outil (avec la bonne syntaxe):

BookmarkBegin
BookmarkTitle: Chapter 1
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
BookmarkTitle: Paragraph 1.1
BookmarkLevel: 2
BookmarkPageNumber: 1
carlo
la source
2

Caleb,

Pour autant que je comprends, les signets selon la spécification PDF ne peuvent pas être injectés via un outil de diagnostic comme pdftk . La mise à jour des métadonnées pour faire référence à des chapitres et des ancres de renvoi de signets qui n'existent pas ne fonctionnera certainement pas, cela peut même rendre votre PDF incohérent ou non ouvert.

J'ai fini par utiliser les bibliothèques java + iText pour faire ce que vous proposez selon ce tutoriel , mais nous traitons des centaines de fichiers PDF quotidiennement, il fallait donc les automatiser. Si vous effectuez une opération ponctuelle, Adobe Acrobat devrait être en mesure de le faire.

r00fus
la source
2

Pour résumer toutes ces bonnes réponses:

Il existe un projet bmconverter sur GitHub qui peut convertir différents formats de signets PDF. Il peut convertir la sortie pdftk au format jpdftweak, bien que si vous utilisez jpdftweak, vous n'aurez pas besoin de convertir la sortie pdftk en csv, car vous pouvez faire tout le travail à partir de jpdftweak.

Malheureusement, pdfmarks n'est pas pris en charge par le projet, mais heureusement, quelqu'un a publié un script dans les problèmes de bmconverter qui peut convertir la sortie de pdftk en pdfmarks. L'option batch ghostscript est donc une option

zetah
la source
2

pdftkle format de signet est un peu fastidieux à écrire. Au lieu de cela , j'ai créé mon propre script en utilisant bash, sed, pdftket python3. Découvrez-le à ce repo: https://github.com/SiddharthPant/booky

Alors maintenant, je peux créer un fichier texte ( bkmrks.txt) comme celui-ci qui ne prend que 5 minutes pour écrire, même pour un pdf de 1000 pages.

{
  Title1, 1
  Title2, 2
  {
    Subtitle1, 3
    Subtitle2, 4
    {
      SubSubtitle1, 5
      ...
    }
  }
}

puis utiliser mon script

./booky.sh pdf_file.pdf bkmrks.txt

cela crée automatiquement un pdf ( pdf_file_new.pdf) qui contient mes signets.

Pantalon Siddharth
la source
1

Ajoutez juste BookmarkBeginavant chaque entrée de signet, comme dans

BookmarkBegin
BookmarkTitle: Front cover
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
    ⋮
tofleplof
la source
0

La redirection que vous avez utilisée à l'étape 1 empêchera update_info de fonctionner correctement. Vous devez plutôt spécifier le fichier de sortie sur pdftk:

pdftk in.pdf dump_data output in.info

Voir cette réponse à partir d'une question similaire: /programming//a/30308964/3158933

Les fichiers que j'ai créés à l'aide d'une redirection ont une taille de fichier légèrement plus grande et provoquent l'émission par pdftk d'un message "Avertissement: cas inattendu 1 dans LoadDataFile (); continuer" lors de l'exécution de la commande update_info.

Bartimée
la source