Converti PDF in immagine ad alta risoluzione


328

Sto cercando di utilizzare il programma da riga di comando convertper acquisire un PDF in un'immagine (JPEG o PNG). Ecco uno dei PDF che sto cercando di convertire.

Voglio che il programma elimini lo spazio bianco in eccesso e restituisca un'immagine di qualità abbastanza alta da poter leggere facilmente gli apice.

Questo è il mio miglior tentativo attuale . Come puoi vedere, il taglio funziona bene, ho solo bisogno di affinare la risoluzione abbastanza. Questo è il comando che sto usando:

convert -trim 24.pdf -resize 500% -quality 100 -sharpen 0x1.0 24-11.jpg

Ho provato a prendere le seguenti decisioni consapevoli:

  • ridimensionalo più grande (non ha alcun effetto sulla risoluzione)
  • rendere la qualità il più elevata possibile
  • usa il -sharpen(ho provato un intervallo di valori)

Qualche suggerimento per favore su come aumentare la risoluzione dell'immagine nel PNG / JPEG finale sarebbe molto apprezzato!


Non lo so, potresti anche provare a link ...
Karnok,


Se sei su un Mac, dai un'occhiata alla pagina man relativa sipsal "sistema di elaborazione delle immagini tramite script". È un editor di immagini da riga di comando integrato in macOS, funziona su PDF e molti altri tipi di immagini.
ghoti,

@ghoti sips convertirà solo la prima pagina di un file PDF in un'immagine.
benwiggy,

Risposte:


386

Sembra che i seguenti lavori:

convert           \
   -verbose       \
   -density 150   \
   -trim          \
    test.pdf      \
   -quality 100   \
   -flatten       \
   -sharpen 0x1.0 \
    24-18.jpg

Si traduce nell'immagine a sinistra . Confronta questo con il risultato del mio comando originale ( l'immagine a destra ):

  

(Per vedere e apprezzare davvero le differenze tra i due, fai clic con il tasto destro su ciascuno di essi e seleziona "Apri immagine in una nuova scheda ..." .)

Inoltre, tieni presente i seguenti fatti:

  • L'immagine peggiore e sfocata sulla destra ha una dimensione del file di 1.941.702 byte (1,85 MByte). La sua risoluzione è di 3060x3960 pixel, utilizzando uno spazio colore RGB a 16 bit.
  • L'immagine migliore e nitida a sinistra ha una dimensione del file di 337,879 byte (330 kByte). La sua risoluzione è di 758x996 pixel, utilizzando lo spazio colore Grigio a 8 bit.

Quindi, non è necessario ridimensionare; aggiungi la -densitybandiera. Il valore di densità 150 è strano: provare una gamma di valori produce un'immagine peggiore in entrambe le direzioni!


77
Il densityparametro è un po 'speciale in quanto deve venire prima del file di input. Dato che il PDF è un formato di file basato su vettori che non ha (molto) nozione di pixel, dice qualcosa come "la pagina ha 8 pollici per 12 pollici". Se vuoi pixel, usa l' densityimpostazione per dirlo, quanti pixel per pollice vuoi ottenere nell'output. Per esempio. con 150 otterresti 8x150 = 1200 per 12x150 = 1800 pixel nell'immagine risultante. Questa è anche la quantità di pixel su cui funzionano le impostazioni di nitidezza, contrasto, compressione ecc.
Daniel Schneller,

8
Può provocare uno sfondo nero su Mac OS (consultare stackoverflow.com/questions/10934456/… ). Per risolvere questo problema, aggiungi -flatten.
Rolf,

2
ho ottenuto uno sfondo nero su Mac OS quando ho provato a convertire pdf in png, aggiungendo -flatten risolto.
olala,

4
Wow! Ho usato l' opzione -densitye -flattenper ridurre la dimensione di un pdf (in un altro pdf). L' -flattenopzione aiuta davvero molto nel ridurre la dimensione totale. Nel mio caso, senza disturbi visivi.
parvus

2
La -densitybandiera probabilmente darà risultati peggiori su valori più alti se la qualità dell'immagine iniziale fosse inferiore a quella.
parvus

153

Personalmente mi piace questo.

convert -density 300 -trim test.pdf -quality 100 test.jpg

È un po 'più del doppio della dimensione del file, ma mi sembra migliore.

-density 300 imposta il dpi al quale viene eseguito il rendering del PDF.

-trim rimuove tutti i pixel dei bordi dello stesso colore dei pixel degli angoli.

-quality 100 imposta la qualità di compressione JPEG sulla massima qualità.

Cose come -sharpennon funzionano bene con il testo perché annullano le cose che il tuo sistema di rendering dei caratteri ha fatto per renderlo più leggibile.

Se lo vuoi davvero saltare in aria usa il ridimensionamento qui e possibilmente un valore dpi più grande di qualcosa del genere targetDPI * scalingFactor Renderà il PDF alla risoluzione / dimensione che intendi.

Le descrizioni dei parametri su imagemagick.org sono qui


È due volte più grande perché la densità di uscita è stata raddoppiata e la qualità di compressione jpg è impostata al massimo (quindi non molta compressione).
Rivimey,

Usando convertcome sapremo quante pagine sono state convertite?
Kiran Reddy,

Uh, questa è sicuramente la strada da percorrere. Aumenta la densità della sorgente e rimuovi il -sharpen. La qualità è molto migliore rispetto alle impostazioni predefinite e molto più naturale che con -sharpen.
Joshua Pinter

19

Uso pdftoppmsulla riga di comando per ottenere l'immagine iniziale, in genere con una risoluzione di 300 dpi pdftoppm -r 300, quindi utilizzare convertla rifilatura e la conversione PNG.


1
pur non usando Imagemagick, questa soluzione sembra maggiormente nello spirito di una conversione trasparente. pdftoppmpuò anche generare JPEG e PNG.
Aaron Brick,

19

normalmente estraggo l'immagine incorporata con 'pdfimages' alla risoluzione nativa, quindi uso la conversione di ImageMagick nel formato necessario:

$ pdfimages -list fileName.pdf
$ pdfimages fileName.pdf fileName   # save in .ppm format
$ convert fileName-000.ppm fileName-000.png

questo genera il file di risultati migliore e più piccolo.

Nota: per immagini JPG con perdita di dati, è necessario utilizzare -j:

$ pdfimages -j fileName.pdf fileName   # save in .jpg format

Con il poppler recente puoi usare -all che salva lossy come jpg e lossless come png

Sulla piattaforma Win fornita poco è stato necessario scaricare un binario recente (0.37 2015) 'poppler-util' da: http://blog.alivate.com.au/poppler-windows/


Solo una piccola correzione: il secondo comando nel primo blocco di codice dovrebbe iniziare con pdftoppm non conpdfimages
satyanarayan rao

no, pdfimages più vecchio salva le immagini estratte in ppm come pdftoppm e pdftoppm non ha mai avuto l'opzione -list. I pdfimages attuali possono essere salvati direttamente in PNG e JPG con -tutto come indicato nella nota
Valerio,

13

Ho trovato sia più veloce che più stabile durante l'elaborazione batch di PDF di grandi dimensioni in PNG e JPG per utilizzare il gscomando sottostante (aka Ghostscript) che convertutilizza.

Puoi vedere il comando nell'output di convert -verbosee ci sono alcune altre modifiche possibili (YMMV) a cui è difficile / impossibile accedere direttamente tramite convert.

Tuttavia, sarebbe più difficile eseguire il taglio e la nitidezza usando gs, quindi, come ho detto, YMMV!


10

Ti dà anche buoni risultati:

exec("convert -geometry 1600x1600 -density 200x200 -quality 100 test.pdf test_image.jpg");

7

Utente Linux qui: ho provato l' convertutilità della riga di comando (da PDF a PNG) e non ero soddisfatto dei risultati. Ho trovato questo più semplice, con un risultato migliore:

  • estrarre le pagine pdf con pdftk
    • per esempio: pdftk file.pdf cat 3 output page3.pdf
  • apri (importa) quel pdf con GIMP
    • importante: cambia l'importazione Resolutionda 100a 300o600 pixel/in
  • in GIMPesportazione come PNG (cambia l'estensione del file in .png)

Modificare:

Aggiunta foto, come richiesto nel Comments. Comando di conversione utilizzato:

convert -density 300 -trim struct2vec.pdf -quality 100 struct2vec.png

GIMP: importato a 300 dpi (px / in); esportato come livello di compressione PNG 3.

Non ho usato GIMP sulla riga di comando (ri: il mio commento, sotto).

pdf2png

inserisci qui la descrizione dell'immagine


1
Questo può essere automatizzato se hai migliaia di pagine?
JBWhitmore,

@JBWhitmore: bella domanda. Certamente sarebbe semplice scrivere il comando pdftk, poiché è già sulla riga di comando. Ho fatto una ricerca su Google molto veloce e ho scoperto che GIMP ha una modalità batch (non l'ho ancora provata, ma sembra che dovrebbe essere anche scriptabile): gimp.org/tutorials/Basic_Batch
Victoria Stuart

1
@JBWhitmore è mostrato uno script di esempio per automatizzare questa conversione su questa domanda / risposta: unix.stackexchange.com/questions/121293/…
tsherwen

1
@tsherwen, se leggo correttamente quel link è come automatizzare il comando convert. Non sono confuso su come farlo. Tuttavia, questa risposta dice di usare GIMP come uno dei passaggi - e né questa risposta né il link sembra mostrare come automatizzarlo.
JBWhitmore,

1
@JBWhitmore. Ho erroneamente pensato solo in termini di domanda convert. Ho visto solo la parte di questa risposta menzionata converte la tua domanda durante la lettura del tuo commento di automazione. Grazie per la tua risposta più avanti su questo thread, che ho combinato con la soluzione a cui ho collegato e risolto un problema diverso che stavo riscontrando.
Tsherwen,

7

Non ho davvero avuto un buon successo con convert[aggiornamento maggio 2020: in realtà: praticamente non funziona mai per me], ma ho avuto un successo ECCELLENTE con pdftoppm. Ecco alcuni esempi di produzione di immagini di alta qualità da un PDF:

  1. [Produce ~ 25 MB di file di dimensioni per pagina] Invia il formato di file .tif non compresso a 300 DPI in una cartella chiamata "immagini", con i file chiamati pg-1.tif , pg-2.tif , pg-3.tif , eccetera:

    mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [Produce file di dimensioni pari a ~ 1 MB per pagina] Output in formato .jpg a 300 DPI :

    mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  3. [Produce file di dimensioni ~ 2 MB per pagina] Output in formato .jpg con la massima qualità (minima compressione) e ancora a 300 DPI :

    mkdir -p images && pdftoppm -jpeg -jpegopt quality=100 -r 300 mypdf.pdf images/pg
    

Per ulteriori spiegazioni, opzioni ed esempi, vedere la mia risposta completa qui:

/ubuntu/150100/extracting-embedded-images-from-a-pdf/1187844#1187844 .

Relazionato:

  1. [Come trasformare un PDF in un PDF ricercabile w / pdf2searchablepdf] /ubuntu/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. Reticolato:
    1. Come convertire un PDF in JPG con riga di comando in Linux?
    2. /unix/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574

6

In ImageMagick, puoi eseguire il "supersampling". Specificare una densità elevata e quindi ridimensionare quanto desiderato per la dimensione di output finale. Ad esempio con la tua immagine:

convert -density 600 test.pdf -background white -flatten -resize 25% test.png


inserisci qui la descrizione dell'immagine

Scarica l'immagine per vederla a piena risoluzione per il confronto.

Non è consigliabile salvare in JPG se si prevede di eseguire ulteriori elaborazioni.

Se si desidera che l'output abbia le stesse dimensioni dell'input, ridimensionare al contrario del rapporto tra la densità e 72. Ad esempio, -densità 288 e -resize 25%. 288 = 4 * 72 e 25% = 1/4

Maggiore è la densità, migliore è la qualità risultante, ma ci vorrà più tempo per l'elaborazione.


3

Un altro suggerimento è che puoi usare GIMP.

Basta caricare il file PDF in GIMP-> salva come .xcf e quindi puoi fare quello che vuoi sull'immagine.


9
Il motivo per farlo tramite la riga di comando è che avevo migliaia di pagine che avevano bisogno di questo processo.
JBWitmore

Inoltre, GIMP esegue il rendering della pagina in fase di caricamento , quindi ti consigliamo di impostare la risoluzione quando selezioni le pagine da caricare. Non importa a cosa imposti i parametri di output se inizi con il caricamento predefinito di 100 DPI.
Keith Davies

1

Uso icepdf un motore java pdf open source. Controlla la demo dell'ufficio .

package image2pdf;

import org.icepdf.core.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class pdf2image {

   public static void main(String[] args) {

      Document document = new Document();
      try {
         document.setFile("C:\\Users\\Dell\\Desktop\\test.pdf");
      } catch (PDFException ex) {
         System.out.println("Error parsing PDF document " + ex);
      } catch (PDFSecurityException ex) {
         System.out.println("Error encryption not supported " + ex);
      } catch (FileNotFoundException ex) {
         System.out.println("Error file not found " + ex);
      } catch (IOException ex) {
         System.out.println("Error IOException " + ex);
      }

      // save page captures to file.
      float scale = 1.0f;
      float rotation = 0f;

      // Paint each pages content to an image and
      // write the image to file
      for (int i = 0; i < document.getNumberOfPages(); i++) {
         try {
         BufferedImage image = (BufferedImage) document.getPageImage(
             i, GraphicsRenderingHints.PRINT, Page.BOUNDARY_CROPBOX, rotation, scale);

         RenderedImage rendImage = image;
         try {
            System.out.println(" capturing page " + i);
            File file = new File("C:\\Users\\Dell\\Desktop\\test_imageCapture1_" + i + ".png");
            ImageIO.write(rendImage, "png", file);
         } catch (IOException e) {
            e.printStackTrace();
         }
         image.flush();
         }catch(Exception e){
             e.printStackTrace();
         }
      }

      // clean up resources
      document.dispose();
   }
}

Ho anche provato imagemagick e pdftoppm , sia pdftoppm che icepdf hanno un'alta risoluzione di imagemagick.


1

Si prega di prendere nota prima di votare, questa soluzione è per Gimp usando un'interfaccia grafica e non per ImageMagick usando una riga di comando, ma ha funzionato perfettamente per me in alternativa, ed è per questo che ho trovato necessario condividere qui.

Segui questi semplici passaggi per estrarre immagini in qualsiasi formato da documenti PDF

  1. Scarica il programma di manipolazione delle immagini GIMP
  2. Aprire il programma dopo l'installazione
  3. Apri il documento PDF che desideri estrarre immagini
  4. Seleziona solo le pagine del documento PDF da cui desideri estrarre le immagini. N / B: se sono necessarie solo le immagini di copertina, selezionare solo la prima pagina.
  5. Fare clic su Apri dopo aver selezionato le pagine da cui si desidera estrarre le immagini
  6. Fare clic sul menu File quando GIMP quando si aprono le pagine
  7. Seleziona Esporta come nel menu File
  8. Seleziona il tipo di file preferito per estensione (ad esempio png) sotto la finestra di dialogo che si apre.
  9. Fare clic su Esporta per esportare l'immagine nella posizione desiderata.
  10. È quindi possibile controllare il file explorer per l'immagine esportata.

È tutto.

Spero che aiuti


La domanda è per ImageMagick usando una riga di comando, non per Gimp usando un'interfaccia grafica.
Sidney,

0

Il file PNG che hai allegato sembra davvero sfocato. Nel caso in cui sia necessario utilizzare una post-elaborazione aggiuntiva per ogni immagine generata come anteprima PDF, si ridurranno le prestazioni della soluzione.

2JPEG può convertire i file PDF che hai allegato a un JPG affilato e ritagliare i margini vuoti in una sola chiamata:

2jpeg.exe -src "C:\In\*.*" -dst "C:\Out" -oper Crop method:autocrop

La sfocatura nel PNG originale è ciò che ha ispirato la domanda in primo luogo, e il PNG nella risposta accettata è piuttosto nitido.
JBWitmore

0

Usa questa riga di comando:

convert -geometry 3600x3600 -density 300x300 -quality 100 TEAM\ 4.pdf team4.png

Questo dovrebbe convertire correttamente il file come richiesto.


0

Il seguente script python funzionerà su qualsiasi Mac (Snow Leopard e versioni successive). Può essere utilizzato sulla riga di comando con file PDF successivi come argomenti oppure è possibile inserire un'azione Esegui script shell in Automator e creare un servizio (Azione rapida in Mojave).

È possibile impostare la risoluzione dell'immagine di output nello script.

Lo script e un'azione rapida possono essere scaricati da github.

#!/usr/bin/python
# coding: utf-8

import os, sys
import Quartz as Quartz
from LaunchServices import (kUTTypeJPEG, kUTTypeTIFF, kUTTypePNG, kCFAllocatorDefault) 

resolution = 300.0 #dpi
scale = resolution/72.0

cs = Quartz.CGColorSpaceCreateWithName(Quartz.kCGColorSpaceSRGB)
whiteColor = Quartz.CGColorCreate(cs, (1, 1, 1, 1))
# Options: kCGImageAlphaNoneSkipLast (no trans), kCGImageAlphaPremultipliedLast 
transparency = Quartz.kCGImageAlphaNoneSkipLast

#Save image to file
def writeImage (image, url, type, options):
    destination = Quartz.CGImageDestinationCreateWithURL(url, type, 1, None)
    Quartz.CGImageDestinationAddImage(destination, image, options)
    Quartz.CGImageDestinationFinalize(destination)
    return

def getFilename(filepath):
    i=0
    newName = filepath
    while os.path.exists(newName):
        i += 1
        newName = filepath + " %02d"%i
    return newName

if __name__ == '__main__':

    for filename in sys.argv[1:]:
        pdf = Quartz.CGPDFDocumentCreateWithProvider(Quartz.CGDataProviderCreateWithFilename(filename))
        numPages = Quartz.CGPDFDocumentGetNumberOfPages(pdf)
        shortName = os.path.splitext(filename)[0]
        prefix = os.path.splitext(os.path.basename(filename))[0]
        folderName = getFilename(shortName)
        try:
            os.mkdir(folderName)
        except:
            print "Can't create directory '%s'"%(folderName)
            sys.exit()

        # For each page, create a file
        for i in range (1, numPages+1):
            page = Quartz.CGPDFDocumentGetPage(pdf, i)
            if page:
        #Get mediabox
                mediaBox = Quartz.CGPDFPageGetBoxRect(page, Quartz.kCGPDFMediaBox)
                x = Quartz.CGRectGetWidth(mediaBox)
                y = Quartz.CGRectGetHeight(mediaBox)
                x *= scale
                y *= scale
                r = Quartz.CGRectMake(0,0,x, y)
        # Create a Bitmap Context, draw a white background and add the PDF
                writeContext = Quartz.CGBitmapContextCreate(None, int(x), int(y), 8, 0, cs, transparency)
                Quartz.CGContextSaveGState (writeContext)
                Quartz.CGContextScaleCTM(writeContext, scale,scale)
                Quartz.CGContextSetFillColorWithColor(writeContext, whiteColor)
                Quartz.CGContextFillRect(writeContext, r)
                Quartz.CGContextDrawPDFPage(writeContext, page)
                Quartz.CGContextRestoreGState(writeContext)
        # Convert to an "Image"
                image = Quartz.CGBitmapContextCreateImage(writeContext) 
        # Create unique filename per page
                outFile = folderName +"/" + prefix + " %03d.png"%i
                url = Quartz.CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, outFile, len(outFile), False)
        # kUTTypeJPEG, kUTTypeTIFF, kUTTypePNG
                type = kUTTypePNG
        # See the full range of image properties on Apple's developer pages.
                options = {
                    Quartz.kCGImagePropertyDPIHeight: resolution,
                    Quartz.kCGImagePropertyDPIWidth: resolution
                    }
                writeImage (image, url, type, options)
                del page

0

Puoi farlo in LibreOffice Draw (che di solito è preinstallato in Ubuntu ):

  1. Apri il file PDF in LibreOffice Draw.
  2. Scorri fino alla pagina di cui hai bisogno.
  3. Assicurarsi che gli elementi di testo / immagine siano posizionati correttamente. In caso contrario, è possibile regolarli / modificarli sulla pagina.
  4. Menu principale: File> Esporta ...
  5. Seleziona il formato immagine che ti serve nel menu in basso a destra. Raccomando PNG.
  6. Assegna un nome al tuo file e fai clic su Salva.
  7. Apparirà la finestra Opzioni, in modo da poter regolare la risoluzione e le dimensioni.
  8. Fai clic su OK e hai finito.

0

Ho usato pdf2image . Una semplice libreria Python che funziona come un fascino.

Prima installa poppler su macchine non linux. Puoi semplicemente scaricare lo zip. Decomprimi in Programmi e aggiungi bin a Percorso macchina.

Dopodiché puoi usare pdf2image nella classe python in questo modo:

from pdf2image import convert_from_path, convert_from_bytes
images_from_path = convert_from_path(
   inputfile,
   output_folder=outputpath,
   grayscale=True, fmt='jpeg')

Non sono bravo con Python ma sono stato in grado di farne a meno. Successivamente è possibile utilizzare exe con i parametri di input e output del file. L'ho usato in C # e le cose funzionano bene.

La qualità dell'immagine è buona. L'OCR funziona bene.


-1

In realtà è abbastanza facile da fare con l'anteprima su un mac. Tutto quello che devi fare è aprire il file in Anteprima e salvare come (o esportare) un png o jpeg ma assicurati di usare almeno 300 dpi nella parte inferiore della finestra per ottenere un'immagine di alta qualità.


6
Questo può essere automatizzato se hai migliaia di pagine?
JBWitmore
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.