it-swarm.it

pdf a jpg senza perdita di qualità; gscan2pdf

Quando converto un file pdf in un mucchio di file jpg usando

convert -quality 100 file.pdf page_%04d.jpg

Ho una perdita di qualità apprezzabile.

Tuttavia, se faccio quanto segue, non vi è alcuna perdita di qualità (evidente):

Avvia gscan2pdf, scegli file-> importa (e scegli file.pdf). Quindi vai alla directory temporanea di gscan2pdf. Esistono molti file pnm (uno per ogni pagina del file pdf). Ora faccio

  for file in *.pnm; do            
  convert $file $file.jpg done

I file jpg risultanti sono (approssimativamente) della stessa qualità del pdf originale (che è quello che voglio).

Ora la mia domanda è: se esiste un modo semplice da riga di comando per convertire il file pdf in un mucchio di file jpg senza una notevole perdita di qualità? (La soluzione sopra è troppo complicata e richiede tempo).

56
student

Non è chiaro cosa intendi per "perdita di qualità". Ciò potrebbe significare molte cose diverse. Potresti pubblicare alcuni esempi per illustrare? Forse tagliare la stessa sezione dalla scarsa qualità e versioni di buona qualità (come un PNG per evitare ulteriori perdite di qualità).

Forse devi usare -density Per fare la conversione con un dpi più alto:

convert -density 300 file.pdf page_%04d.jpg

(È possibile anteporre -units PixelsPerInch O -units PixelsPerCentimeter Se necessario. La mia copia viene impostata automaticamente su ppi.)

Aggiornamento: Come hai sottolineato, gscan2pdf (Il modo in cui lo stai usando) è solo un wrapper per pdfimages (da poppler ). pdfimages non fa la stessa cosa che fa convert quando viene dato un PDF come input.

convert prende il PDF, lo rende ad una certa risoluzione e usa l'immagine bitmap risultante come immagine di origine.

pdfimages cerca in PDF immagini bitmap incorporate ed esporta ognuna in un file. Ignora semplicemente qualsiasi comando di testo o disegno vettoriale nel PDF.

Di conseguenza, se quello che hai è un PDF che è solo un wrapper attorno a una serie di bitmap, pdfimages farà un lavoro molto migliore di estrarli, perché ti porta i dati grezzi al suo Misura originale. Probabilmente vuoi anche usare l'opzione -j Su pdfimages, perché un PDF può contenere dati JPEG non elaborati. Per impostazione predefinita, pdfimages converte tutto in formato PNM e la conversione di JPEG> PPM> JPEG è un processo con perdita di dati.

Allora prova

pdfimages -j file.pdf page

Potrebbe essere necessario o meno seguirlo con un passaggio da convert a .jpg (A seconda del formato bitmap utilizzato da PDF).

Ho provato questo comando su un PDF creato da una sequenza di immagini JPEG. I JPEG estratti erano byte per byte identici alle immagini di origine. Non puoi ottenere una qualità superiore a quella.

101
cjm

Come ha detto la risposta dello studente, pdfimages è una buona opzione. Dalla mia esperienza, sia gs che convert vengono esportati in qualità scadente, indipendentemente dal fatto che tu specifichi il giusto dpi.

Ma se il pdf ha più livelli per pagina pdfimages non funziona ed estrae i livelli come immagine separata, in tal caso è meglio usare inskcape per esportare la pagina come si vede.

Questi sono i comandi che utilizzo:

pdftk combined_to_do.pdf burst output pg_%04d.pdf
ls ./pg*.pdf | xargs -L1 -I {}  inkscape {} -z --export-dpi=300 --export-area-drawing --export-png={}.png

Il primo comando divide tutte le pagine il secondo comando converte pagina per pagina in png. Puoi tenerli png o semplicemente convertirli in jpeg

ls ./p*.png | xargs -L1 -I {} convert {}  -quality 100 -density 300 {}.jpg

Rispetto a pdfimages, gs e a ImageMagick convert trovo che l'esportazione di inkscape sia la migliore in termini di qualità.

4

la risposta di @cjm è corretta, ma se ti piace la GUI e non vuoi renderizzare tutte le pagine pdf, solo per ottenere un'immagine, usa gimp.

Apri un pdf con gimp e otterrai una finestra di importazione con tutte le pagine renderizzate. Scegli qualsiasi pagina desideri e imposta la risoluzione su 600 pixel/pollice (ne ho trovati 300 troppo nitidi in molti casi). Salva nel formato desiderato con "File/esporta"

Comunque, ci deve essere una bandiera per selezionare le pagine desiderate dalla riga di comando.

3
albfan

Guardando il codice sorgente gscan2pdf ho notato che utilizza pdfimages. Così pdfimages file.pdf page comporterebbe page-001.ppm, page-002.ppm eccetera.

2
student

Ciò che non è chiaro nella tua domanda è se parli di testo e grafica vettoriale nel tuo pdf o se il tuo pdf contiene immagini incorporate.

Dopo aver letto di cosa tratta gscan2pdf, suppongo che i tuoi file pdf contengano (solo) grafica incorporata.

convert essenzialmente "stampa" il tuo pdf senza riguardo per quale sia il contenuto. Come suggerisce @cjm, potresti voler cambiare la densità di stampa. Questo è l'unico modo per aumentare la qualità della grafica vettoriale.

Se invece, quello che vuoi fare è estrarre immagini incorporate (proprio come gscan2pdf sembra fare), indovinare la densità di solito porta a una perdita di qualità o di qualità superiore a quella richiesta (e allo spreco di spazio su disco). La risposta quindi è estrarre l'immagine anziché stampare il pdf. Vedi questo articolo che sostanzialmente sostiene l'uso di pdfimages per estrarre immagini senza perdita di qualità.

2
asoundmove