Aggiungi e modifica i segnalibri in pdf


22

Ottenendo metadati da alcuni file pdf con segnalibri di pdftk, osservo il formato dei segnalibri nei metadati pdf. Quindi immagino che con pdftk, è possibile aggiungere e modificare i segnalibri di un file pdf.

Ecco tre passaggi che seguo:

  1. In primo luogo ottengo i metadati (compresi eventuali segnalibri) da un file pdf in un file di testo da pdftk in.pdf dump_data > in.info.
  2. Successivamente aggiungo alcuni segnalibri nel file di testo dei metadati in.info, cambiandolo da

    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
    

    a

    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. Quindi provo a riportare i metadati modificati nel file pdf di pdftk in.pdf update_info in.info output out.pdf.

Ma quando apro il nuovo file pdf out.pdfin evince o adobe reader, non ci sono segnalibri nel nuovo file pdf.

Se ottengo i metadati dal nuovo file pdf out.pdfda pdftk out.pdf dump_data > out.info, non ci saranno segnalibri out.info. Sembra che i segnalibri non siano stati aggiunti correttamente.

Mi chiedevo se ci fossero degli errori? Come devo aggiungere e modificare i segnalibri di un file pdf, non necessariamente da pdftk?


1
Questo piccolo strumento grafico ha funzionato per me. (PDF Mod 0.9.1) apps.fedoraproject.org/packages/pdfmod
abhijit

Risposte:


12

Mi sembra dalla versione 1.45 (2012-12-06), pdftk non consente la modifica dei segnalibri tramite il comando update_info:

Ora puoi aggiungere o modificare i segnalibri di un PDF usando update_info.

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


3
Questo ha funzionato molto bene per me. Si dovrebbe aggiungere che nel file di input sopra i BookmarkBegintag prima che manchi ogni voce del segnalibro.
danielp,

4

jPDFtweak (Java, quindi funziona su Unix / Linux) può alterare i segnalibri, ma non so se puoi scrivere qualcosa con esso.

Per lo scripting, immagino che la tua unica opzione nativa Unix / Linux sia pdflatex con il pacchetto pdfpages. Ma questa è una curva di apprendimento se non sei già un utente LaTeX.

EDIT: In realtà potrebbe essere possibile con ghostscript: vedi qui o qui o qui


4

Se continui a seguire questi script unix, allora

  1. estrarre i dati dei segnalibri scaricati da pdftk
  2. scrivere uno script aggiuntivo per convertire i dati dei segnalibri scaricati in formato pdfmarks, il cui comando ghostscript gsè accettato.
  3. usa lo gsscript per unirli insieme a pdfmarks

Dai un'occhiata a http://blog.tremily.us/posts/PDF_bookmarks_with_Ghostscript/ lo script pdf-merge.pyfa esattamente quello che tu (o io) vuoi.

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

Alcuni piccoli miglioramenti potrebbero essere fatti nella sua sceneggiatura

  1. gestione unicode
  2. output dei file dei segnalibri, in modo che anche le persone possano modificarlo

Comunque, dovrebbe funzionare


Un voto! Grazie! Non vedo l'ora della tua sceneggiatura!
Tim

Sembra che il collegamento non funzioni. Puoi aggiustarlo per favore?
Fish Monitor,

4

pdftk è sicuramente lo strumento giusto (con la sintassi giusta):

BookmarkBegin
BookmarkTitle: Chapter 1
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
BookmarkTitle: Paragraph 1.1
BookmarkLevel: 2
BookmarkPageNumber: 1

2

Caleb

Per quanto ho capito, i segnalibri secondo le specifiche PDF non possono essere iniettati tramite uno strumento diagnostico come pdftk. L'aggiornamento dei metadati per fare riferimento ai capitoli e alle ancore di destinazione dei segnalibri che non esistono sicuramente non funzionerà, potrebbe persino rendere il tuo PDF incoerente o non aperto.

Ho finito per usare le librerie java + iText per fare ciò che stai suggerendo in questo tutorial , ma abbiamo a che fare con centinaia di pdf ogni giorno, quindi è necessario che sia automatizzato. Se stai eseguendo una tantum, Adobe Acrobat dovrebbe essere in grado di farlo.


2

Per riassumere tutte queste buone risposte:

Esiste un progetto bmconverter su GitHub che può convertire vari formati di segnalibri PDF. Può convertire l'output di pdftk nel formato jpdftweak, anche se se si utilizza jpdftweak non sarà necessario convertire l'output di pdftk in csv, poiché è possibile eseguire tutte le operazioni dall'interno di jpdftweak.

Sfortunatamente pdfmarks non è supportato dal progetto, ma fortunatamente qualcuno ha pubblicato script in problemi di bmconverter che possono convertire l'output di pdftk in pdfmarks. Quindi l'opzione batch ghostscript è un'opzione


2

pdftkil formato dei segnalibri è un po 'noioso da scrivere. Invece ho creato il mio script utilizzando bash, sed, pdftke python3. Dai un'occhiata a questo repository: https://github.com/SiddharthPant/booky

Quindi ora posso creare un file di testo ( bkmrks.txt) come questo che richiede solo 5 minuti per scrivere anche per un pdf di 1000 pagine.

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

e poi usa la mia sceneggiatura

./booky.sh pdf_file.pdf bkmrks.txt

questo crea automaticamente un pdf ( pdf_file_new.pdf) che contiene i miei segnalibri.


1

Basta aggiungere BookmarkBeginprima di ogni voce del segnalibro, come in

BookmarkBegin
BookmarkTitle: Front cover
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
    ⋮

0

Il reindirizzamento utilizzato nel passaggio 1 farà sì che update_info non funzioni correttamente. Devi invece specificare il file di output su pdftk:

pdftk in.pdf dump_data output in.info

Vedi questa risposta da una domanda simile: /programming//a/30308964/3158933

I file che ho creato utilizzando un reindirizzamento hanno dimensioni leggermente maggiori e fanno sì che pdftk emetta un messaggio "Avviso: caso imprevisto 1 in LoadDataFile (); proseguendo" durante l'esecuzione del comando update_info.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.