Come visualizzare e modificare il codice di un file PDF


12

Mi chiedevo come visualizzare e modificare il codice di un file PDF?

  1. Visualizzando, non voglio vedere il formato binario, quindi penso che hexdumppotrebbe non essere quello che voglio. Ho provato gedit, ma nessun metodo di codifica può essere utilizzato per decodificare il contenuto PDF.

  2. Modificando, vorrei /Fitcercarli e cambiarli in ad /XYZesempio sed. Ma il mio comando sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfsembra non cambiare l'aspetto del mio PDF come mi aspettavo, anche se non riporta alcun errore. Mi chiedevo se sedpotesse davvero funzionare su file PDF come se fossero solo testo?

Il contesto delle mie domande può essere trovato da questa domanda . Il mio sistema operativo è Ubuntu 10.10.

Risposte:


9

È possibile utilizzare sedcon file binari (almeno GNU sed; alcune implementazioni potrebbero avere problemi con file contenenti caratteri null o che non terminano con un carattere di nuova riga). Ma il comando che hai usato sostituisce solo la prima occorrenza di /Fitogni riga e le righe sono praticamente insignificanti in un file PDF. Devi sostituire tutte le occorrenze:

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

Sarebbe più robusto sostituire solo /Fitse non è seguito da una parola costituente (ad esempio, non sostituendo /Fitness; non so se il tuo file contenga occorrenze /Fitche potrebbero causare problemi). Ecco un modo:

perl -pe 's!/Fit\b!/XYZ!g'

Grazie! Ora funziona! (1) Mi chiedevo come sed cerca i caratteri nei contenuti binari? Sed prima codifica i caratteri della query prima della ricerca? (2) l'ultimo comando, quello che fa !, \be gdire? Può essere fatto senza perl solo con sed?
Tim

1
@Tim (1) Sed carica i dati in memoria, li utilizza e li stampa. Perché dovrebbe codificare qualcosa? (2) gsignifica sostituire tutte le occorrenze su ciascuna riga, sia in sed che in perl. !è il separatore; puoi scegliere (quasi) qualsiasi carattere come separatore per il scomando (questo vale sia in sed che in perl). \bsignifica una parola limite; esiste in perl ma non in sed.
Gilles 'SO- smetti di essere malvagio' il

Informazioni su (1), perché i caratteri che dai a sed nel comando sono leggibili dall'uomo. Se il contenuto in cui cercare è completamente binario, come può sed trovare lì la parola della query?
Tim

@Tim Text sono dati binari che sembrano essere leggibili dall'uomo.
Gilles 'SO- smetti di essere malvagio' il

1
@Tim Sì, è possibile passare dati binari nella query. Dovrai inserire i caratteri letteralmente nel tuo codice sorgente sed o shell.
Gilles 'SO- smetti di essere malvagio' il

17

Per quanto riguarda la tua prima domanda ("visualizzazione del codice sorgente, ma non binario"): ci sono alcune opzioni che hai per decomprimere i flussi binari interni che sono collegati a molti oggetti.

Il mio strumento preferito per questo è QPDF , disponibile su tutte le principali piattaforme del sistema operativo. Il comando seguente decomprime tutti i flussi e tutti i flussi di oggetti:

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

Ora puoi aprire il tuo PDF in qualsiasi editor di testo. (Potrebbero esserci ancora alcuni BLOB binari: ad esempio file di font e profili ICC, che non avrebbero senso espandere QPDF).

Per ri-comprimere il expanded.pdfnuovo dopo la modifica, è possibile eseguire:

 qpdf expanded.pdf orig2.pdf

(Attento durante la modifica manuale dei PDF! Devi sapere molto sulla loro sintassi interna per fare questo nel modo giusto. Non appena aggiungi o elimini un singolo byte, puoi ricevere messaggi di errore dai lettori PDF che potrebbero non essere più in grado di aprilo, perché il ToC interno dei PDF è danneggiato, che si basa su calcoli di offset dei byte. La semplice sostituzione Fitcon XYZstringhe dovrebbe andare bene, però ...)


1
Puoi anche aggiungere o rimuovere testo. Quando la lunghezza di un flusso di oggetti cambia, gli offset di byte possono essere ricalcolati usando il fix-qdfprogramma che fa parte di qpdf. Devi comunque stare un po 'attento. Vedi qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich

@H.Rittich: Grazie per il commento ... In che modo pensi che questo apra una nuova prospettiva sul problema? Pensi che non sappiamo che possiamo aggiungere o rimuovere il testo in questo modo?
Kurt Pfeifle,

@KursPfeifle: non faccio ipotesi su ciò che sai. La risposta afferma che la modifica di un PDF in questo modo deve preservare gli offset di byte degli oggetti nel file. Tuttavia, è possibile modificare gli offset di byte in seguito correggendoli utilizzando fix-qdf. Pertanto, se si desidera sostituire una stringa con una stringa di diversa lunghezza, è possibile, ma è necessario utilizzare lo fix-qdfstrumento. Direi che questa è un'utile aggiunta alla risposta.
H. Rittich,

@ H.Rittich: Grazie per aver dato la tua prospettiva. Quando ho sottolineato la necessità di preservare gli offset di byte di oggetti, non volevo consigliare le persone su COME dovrebbero farlo. Se avessi formulato il tuo commento in modo leggermente diverso, avrei capito più velocemente l'intenzione del tuo commento.
Kurt Pfeifle,

1

sedè orientato alla linea, il che lo rende non adatto ai file binari, che sono strutturati come blocchi e non linee.
Prova invece a usare bbe (bbe-.sourceforge.net).

In alternativa, sia Emacs (GNU e XEmacs) che vim aprono i file PDF senza soluzione di continuità. Naturalmente non è molto carino, dato che è testo misto e binario, ma è sufficiente per i tuoi scopi di modifica.
Esiste un plug-in Pdftk per vim che rende tutto più semplice, scaricalo qui (file zip).
Come probabilmente saprai, entrambi gli editor sopra hanno potenti funzionalità di ricerca e sostituzione.

Inoltre, la conversione del PDF in modalità QDF prima rende la modifica dei file PDF davvero semplice.


Puoi anche provare a modificare sedusando l' -binterruttore. se funziona lo aggiungerò alla mia risposta.
Philomath,

@Tim: cosa intendi con "non mostra nulla", solo vuoto? qualche messaggio di errore? Inoltre, puoi provare con XEmacs? (tutti e tre hanno lavorato per me).
Philomath,

Non importa -b, è cygwin specifico.
Philomath,

Emacs dice "Il file 1.pdf è grande (9 MB), davvero aperto? (Yo n)". Ho scelto "y", e poi non c'è niente.
Tim

Molto probabilmente un problema con Emacs, hai XEmacs? (Ho appena aperto un PDF da 31 MB senza problemi).
Philomath,

0

Usa LibreOffice o OpenOffice per aprire il PDF, visualizzarlo, sostituire elementi, scrivere un nuovo PDF, ecc. Penso che puoi persino usarlo dalla riga di comando o a livello di programmazione se ci sono molti documenti da elaborare.

Tieni presente che i PDF di alcune fonti, ad esempio gli scanner, spesso contengono le pagine come immagini anziché come testo, quindi non avrai fortuna con loro per l'utilizzo della ricerca e della sostituzione.


3
(1/2) Tenere presente quanto segue: LibreOffice non è un editor PDF nativo. Quando apre un PDF, converte tutte le pagine in un'immagine vettoriale (che può mantenere le parti raster dal PDF originale come parti raster) e lo apre nella parte LibreOffice Draw della suite LibreOffice. Quindi, quando salva il file PDF modificato, sarà un file PDF che è stato esportato dal formato nativo di LibreOffice Draw (con il suffisso .odg ) in PDF.
Kurt Pfeifle,

3
(2/2) Questo flusso di lavoro può avere effetti collaterali imprevisti. Inoltre, l'applicazione LibreOffice Draw potrebbe non essere in grado di importare correttamente tutti gli elementi dal PDF originale. Tuttavia, in molti casi può ancora essere uno strumento utile per tutte quelle persone che non hanno mezzi migliori disponibili.
Kurt Pfeifle,
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.