Convertir un PDF en image à haute résolution


328

J'essaie d'utiliser le programme de ligne de commande convertpour prendre un PDF dans une image (JPEG ou PNG). Voici l' un des PDF que j'essaie de convertir.

Je veux que le programme supprime l'excès d'espace blanc et renvoie une image de qualité suffisamment élevée pour que les exposants puissent être lus facilement.

Ceci est ma meilleure tentative actuelle . Comme vous pouvez le voir, le recadrage fonctionne bien, j'ai juste besoin d'affiner un peu la résolution. Voici la commande que j'utilise:

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

J'ai essayé de prendre les décisions conscientes suivantes:

  • le redimensionner plus grand (n'a aucun effet sur la résolution)
  • rendre la qualité aussi élevée que possible
  • utiliser le -sharpen(j'ai essayé une gamme de valeurs)

Toutes les suggestions s'il vous plaît sur l'obtention de la résolution de l'image dans le PNG / JPEG final plus élevé seraient grandement appréciées!


Je ne sais pas, vous pouvez aussi essayer le lien ...
karnok


Si vous êtes sur un Mac, consultez la page de manuel pour sips, le "système de traitement d'image scriptable". Il s'agit d'un éditeur d'images en ligne de commande intégré à macOS, qui fonctionne sur les PDF et de nombreux autres types d'images.
ghoti

@ghoti sips ne convertira que la première page d'un fichier PDF en image.
benwiggy

Réponses:


386

Il semble que les travaux suivants:

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

Il en résulte l'image de gauche . Comparez cela au résultat de ma commande d'origine ( l'image à droite ):

  

(Pour vraiment voir et apprécier les différences entre les deux, faites un clic droit sur chacun et sélectionnez "Ouvrir l'image dans un nouvel onglet ..." .)

Gardez également à l'esprit les faits suivants:

  • La pire image floue à droite a une taille de fichier de 1,941,702 octets (1,85 Mo). Sa résolution est de 3060x3960 pixels, en utilisant un espace colorimétrique RVB 16 bits.
  • La meilleure image nette à gauche a une taille de fichier de 337,879 octets (330 Ko). Sa résolution est de 758 x 996 pixels, en utilisant un espace colorimétrique gris 8 bits.

Donc, pas besoin de redimensionner; ajoutez le -densitydrapeau. La valeur de densité 150 est bizarre - essayer une plage de valeurs donne une image plus mauvaise dans les deux sens!


77
Le densityparamètre est un peu spécial en ce que doit venir avant le fichier d'entrée. Comme PDF est un format de fichier vectoriel qui n'a pas (beaucoup) de notion de pixels, il dit quelque chose comme "la page est de 8 pouces sur 12 pouces". Si vous voulez un pixel, vous utilisez le densityparamètre pour lui dire, combien de pixels par pouce vous voulez obtenir dans la sortie. Par exemple. avec 150, vous obtiendrez 8x150 = 1200 par 12x150 = 1800 pixels dans l'image résultante. C'est également la quantité de pixels sur laquelle les paramètres de netteté, de contraste, de compression, etc. fonctionnent.
Daniel Schneller

8
Il peut en résulter un fond noir sur Mac OS (voir stackoverflow.com/questions/10934456/… ). Pour résoudre ce problème, ajoutez -flatten.
Rolf

2
j'ai un fond noir sur Mac OS lorsque j'ai essayé de convertir le pdf en png, l'ajout de -flatten l'a résolu.
olala

4
Hou la la! Je viens d'utiliser l' option -densityet -flattenpour réduire la taille d'un pdf (à un autre pdf). L' -flattenoption aide vraiment beaucoup à réduire la taille totale. Dans mon cas, sans troubles visuels.
parvus

2
Le -densitydrapeau donnera probablement de plus mauvais résultats sur des valeurs plus élevées si la qualité de l'image de départ était inférieure à cela.
parvus

153

Personnellement, j'aime ça.

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

C'est un peu plus du double de la taille du fichier, mais ça me semble mieux.

-density 300 définit le dpi auquel le PDF est rendu.

-trim supprime tous les pixels de bord qui sont de la même couleur que les pixels de coin.

-quality 100 définit la qualité de compression JPEG sur la plus haute qualité.

Des choses comme -sharpenne fonctionnent pas bien avec le texte car elles annulent les choses que votre système de rendu de police a fait pour le rendre plus lisible.

Si vous voulez vraiment le faire exploser, utilisez redimensionner ici et peut-être une valeur dpi plus élevée de quelque chose comme targetDPI * scalingFactor ça rendra le PDF à la résolution / taille que vous souhaitez.

Les descriptions des paramètres sur imagemagick.org sont ici


C'est deux fois la taille principalement parce que la densité de sortie a été doublée et la qualité de compression jpg est réglée sur max (donc pas beaucoup de compression).
rivimey

En utilisant convertcomment saurons - nous combien de pages se convertit?
Kiran Reddy du

Euh, c'est définitivement la voie à suivre. Augmentez cette densité de source et supprimez le -sharpen. La qualité est bien meilleure qu'avec les valeurs par défaut et bien plus naturelle qu'avec -sharpen.
Joshua Pinter

19

J'utilise pdftoppmsur la ligne de commande pour obtenir l'image initiale, généralement avec une résolution de 300 dpi pdftoppm -r 300, alors utilisez-la convertpour effectuer le découpage et la conversion PNG.


1
sans utiliser Imagemagick, cette solution semble plus dans l'esprit d'une conversion transparente. pdftoppmpeut également produire des fichiers JPEG et PNG.
Aaron Brick

19

normalement j'extrais l'image intégrée avec 'pdfimages' à la résolution native, puis utilise la conversion d'ImageMagick au format requis:

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

cela génère le meilleur et le plus petit fichier de résultats.

Remarque: Pour les images intégrées JPG avec perte, vous avez dû utiliser -j:

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

Avec Poppler récent, vous pouvez utiliser -tout ce qui enregistre lossy en jpg et lossless en png

Sur la plate-forme Win peu fournie, vous avez dû télécharger un binaire récent (0.37 2015) «poppler-util» sur: http://blog.alivate.com.au/poppler-windows/


Juste une correction mineure: la deuxième commande du premier bloc de code devrait commencer par pdftoppm not withpdfimages
satyanarayan rao

non, les anciennes images pdf enregistrent les images extraites en ppm comme pdftoppm, et pdftoppm n'a jamais eu l'option -list. Les images pdf actuelles peuvent être enregistrées directement en PNG et JPG avec -tout comme indiqué dans la note
Valerio

13

Je l'ai trouvé à la fois plus rapide et plus stable lors du traitement par lots de gros PDF en PNG et JPG pour utiliser la commande sous-jacente gs(aka Ghostscript) qui convertutilise.

Vous pouvez voir la commande dans la sortie de convert -verboseet il y a quelques autres ajustements possibles (YMMV) qui sont difficiles / impossibles à accéder directement via convert.

Cependant, il serait plus difficile de couper et d'affûter avec gs, donc, comme je l'ai dit, YMMV!


10

Cela vous donne également de bons résultats:

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

7

Utilisateur Linux ici: j'ai essayé l' convertutilitaire de ligne de commande (pour PDF en PNG) et je n'étais pas satisfait des résultats. J'ai trouvé que c'était plus facile, avec un meilleur résultat:

  • extraire les pages pdf avec pdftk
    • par exemple: pdftk file.pdf cat 3 output page3.pdf
  • ouvrir (importer) ce pdf avec GIMP
    • important: changez l'importation Resolutionde 100à 300ou600 pixel/in
  • en GIMPexportation au format PNG (changer l'extension du fichier en .png)

Éditer:

Image ajoutée, comme demandé dans le Comments. Commande de conversion utilisée:

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

GIMP: importé à 300 dpi (px / in); exporté en tant que niveau de compression PNG 3.

Je n'ai pas utilisé GIMP sur la ligne de commande (re: mon commentaire, ci-dessous).

pdf2png

entrez la description de l'image ici


1
Cela peut-il être automatisé si vous avez des milliers de pages?
JBWhitmore

@JBWhitmore: bonne question. Il serait certainement simple de scripter la commande pdftk, car elle est déjà sur la ligne de commande. J'ai fait une recherche Google très rapide et j'ai trouvé que GIMP a un mode batch (je ne l'ai pas essayé, mais il semble que cela devrait également être scriptable): gimp.org/tutorials/Basic_Batch
Victoria Stuart

1
@JBWh plus un exemple de script pour automatiser cette conversion est montré sur cette question / réponse: unix.stackexchange.com/questions/121293/…
tsherwen

1
@tsherwen, Si j'ai bien lu ce lien, c'est comment automatiser la commande convert. Je ne suis pas confus sur la façon de procéder. Cependant, cette réponse dit d'utiliser GIMP comme l'une des étapes - et ni cette réponse ni le lien ne semblent montrer comment automatiser cela.
JBWhitmore

1
@JBWhitmore. Par erreur, je pensais simplement à la question convert. J'ai seulement vu la partie de cette réponse mentionner convertet votre question en lisant votre commentaire sur l'automatisation. Merci pour votre réponse plus tard sur ce fil, que j'ai combiné avec la solution à laquelle j'ai lié et résolu un problème différent que je rencontrais.
tsherwen

7

Je n'ai vraiment pas eu un bon succès avec convert[mise à jour mai 2020: en fait: ça ne marche presque jamais pour moi], mais j'ai eu un EXCELLENT succès avec pdftoppm. Voici quelques exemples de production d'images de haute qualité à partir d'un PDF:

  1. [Produit environ 25 Mo de fichiers par page] Exportez le format de fichier .tif non compressé à 300 DPI dans un dossier appelé "images", les fichiers étant nommés pg-1.tif , pg-2.tif , pg-3.tif , etc:

    mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [Produit ~ 1 Mo de fichiers par page] Sortie au format .jpg à 300 DPI :

    mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  3. [Produit des fichiers de ~ 2 Mo par page] Sortie au format .jpg avec la plus haute qualité (moindre compression) et toujours à 300 DPI :

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

Pour plus d'explications, d'options et d'exemples, voir ma réponse complète ici:

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

En relation:

  1. [Comment transformer un PDF en PDF consultable avec pdf2searchablepdf] /ubuntu/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. Réticulé:
    1. Comment convertir un PDF en JPG avec la ligne de commande sous Linux?
    2. /unix/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574

6

Dans ImageMagick, vous pouvez faire du "suréchantillonnage". Vous spécifiez une grande densité, puis redimensionnez autant que vous le souhaitez pour la taille de sortie finale. Par exemple avec votre image:

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


entrez la description de l'image ici

Téléchargez l'image pour la voir en pleine résolution pour comparaison.

Je ne recommande pas d'enregistrer au format JPG si vous prévoyez de poursuivre le traitement.

Si vous souhaitez que la sortie soit de la même taille que l'entrée, redimensionnez-la à l'inverse du rapport de votre densité à 72. Par exemple, -densité 288 et -resize 25%. 288 = 4 * 72 et 25% = 1/4

Plus la densité est élevée, meilleure est la qualité résultante, mais le traitement prendra plus de temps.


3

Une autre suggestion est que vous pouvez utiliser GIMP.

Il suffit de charger le fichier PDF dans GIMP-> enregistrer au format .xcf et vous pourrez alors faire ce que vous voulez sur l'image.


9
La raison de cela via la ligne de commande est que j'avais des milliers de pages qui avaient besoin de ce processus.
JBWhitmore

De plus, GIMP rend la page lors du chargement , vous voudrez donc définir la résolution lorsque vous sélectionnez les pages à charger. Peu importe ce que vous définissez les paramètres de sortie si vous commencez avec la valeur par défaut de 100 DPI au chargement.
Keith Davies

1

J'utilise icepdf un moteur java pdf open source. Vérifiez la démo du bureau .

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();
   }
}

J'ai également essayé imagemagick et pdftoppm , pdftoppm et icepdf ont une haute résolution qu'imagemagick.


1

Veuillez prendre note avant de voter contre, cette solution est pour Gimp utilisant une interface graphique, et non pour ImageMagick utilisant une ligne de commande, mais cela a parfaitement fonctionné pour moi comme alternative, et c'est pourquoi j'ai trouvé nécessaire de partager ici.

Suivez ces étapes simples pour extraire des images dans n'importe quel format à partir de documents PDF

  1. Télécharger le programme de manipulation d'images GIMP
  2. Ouvrez le programme après l'installation
  3. Ouvrez le document PDF dont vous souhaitez extraire les images
  4. Sélectionnez uniquement les pages du document PDF dont vous souhaitez extraire les images. N / B: Si vous n'avez besoin que des images de couverture, sélectionnez uniquement la première page.
  5. Cliquez sur Ouvrir après avoir sélectionné les pages dont vous souhaitez extraire les images
  6. Cliquez sur le menu Fichier lorsque GIMP lorsque les pages s'ouvrent
  7. Sélectionnez Exporter sous dans le menu Fichier
  8. Sélectionnez votre type de fichier préféré par extension (par exemple png) sous la boîte de dialogue qui apparaît.
  9. Cliquez sur Exporter pour exporter votre image vers l'emplacement souhaité.
  10. Vous pouvez ensuite vérifier dans votre explorateur de fichiers l'image exportée.

C'est tout.

J'espère que ça aide


La question est pour ImageMagick utilisant une ligne de commande, pas pour Gimp utilisant une interface graphique.
sidney

0

Le fichier PNG que vous avez joint semble vraiment flou. Si vous devez utiliser un post-traitement supplémentaire pour chaque image que vous avez générée en tant qu'aperçu PDF, vous diminuerez les performances de votre solution.

2JPEG peut convertir le fichier PDF que vous avez joint en un joli JPG plus net et recadrer les marges vides en un seul appel:

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

Le flou dans le PNG d'origine est ce qui a inspiré la question en premier lieu, et le PNG dans la réponse acceptée est plutôt net.
JBWhitmore

0

Utilisez cette ligne de commande:

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

Cela devrait convertir correctement le fichier comme vous l'avez demandé.


0

Le script python suivant fonctionnera sur n'importe quel Mac (Snow Leopard et supérieur). Il peut être utilisé sur la ligne de commande avec des fichiers PDF successifs comme arguments, ou vous pouvez les insérer dans une action Exécuter le script Shell dans Automator et créer un service (Action rapide dans Mojave).

Vous pouvez définir la résolution de l'image de sortie dans le script.

Le script et une action rapide peuvent être téléchargés depuis 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

Vous pouvez le faire dans LibreOffice Draw (qui est généralement préinstallé dans Ubuntu ):

  1. Ouvrez le fichier PDF dans LibreOffice Draw.
  2. Faites défiler jusqu'à la page dont vous avez besoin.
  3. Assurez-vous que les éléments texte / image sont placés correctement. Sinon, vous pouvez les ajuster / modifier sur la page.
  4. Menu supérieur: Fichier> Exporter ...
  5. Sélectionnez le format d'image dont vous avez besoin dans le menu en bas à droite. Je recommande PNG.
  6. Nommez votre fichier et cliquez sur Enregistrer.
  7. La fenêtre d'options apparaîtra, vous pouvez donc ajuster la résolution et la taille.
  8. Cliquez sur OK et vous avez terminé.

0

J'ai utilisé pdf2image . Une bibliothèque python simple qui fonctionne comme un charme.

Installez d'abord poppler sur une machine non Linux. Vous pouvez simplement télécharger le zip. Décompressez dans Program Files et ajoutez bin au chemin de la machine.

Après cela, vous pouvez utiliser pdf2image en classe python comme ceci:

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

Je ne suis pas bon avec python mais j'ai pu en faire un exe. Plus tard, vous pourrez utiliser l'exe avec le paramètre d'entrée et de sortie du fichier. Je l'ai utilisé en C # et les choses fonctionnent bien.

La qualité d'image est bonne. L'OCR fonctionne bien.


-1

C'est en fait assez facile à faire avec Aperçu sur un mac. Tout ce que vous avez à faire est d'ouvrir le fichier dans Aperçu et de l'enregistrer (ou d'exporter) au format png ou jpeg mais assurez-vous d'utiliser au moins 300 dpi en bas de la fenêtre pour obtenir une image de haute qualité.


6
Cela peut-il être automatisé si vous avez des milliers de pages?
JBWhitmore
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.