web-dev-qa-db-fra.com

Convertir PDF créer une image en haute résolution

J'essaie d'utiliser le programme de ligne de commande convert pour insérer un PDF dans une image (JPEG ou PNG). Voici un des fichiers PDF que je tente de convertir. 

Je souhaite que le programme supprime l'espace blanc en excès et renvoie une image de qualité suffisamment élevée pour permettre la lecture facile des indices supérieurs.

Ceci est mon meilleure tentative actuelle . Comme vous pouvez le constater, le rognage fonctionne bien, il me faut simplement améliorer la résolution. C'est 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:

  • redimensionnez-le plus grand (n'a aucun effet sur la résolution)
  • rendre la qualité aussi haute que possible
  • utilisez le -sharpen (j'ai essayé une plage de valeurs)

Toutes les suggestions sur l'obtention de la résolution de l'image dans le fichier final PNG/JPEG plus élevé seraient grandement appréciées!

265
JBWhitmore

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 ceci au résultat de ma commande originale ( 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 une image dans un nouvel onglet ...".)

Gardez également à l’esprit les faits suivants:

  • La pire image floue sur la droite a une taille de fichier de 1.941.702 octets (1.85 MByte) . Sa résolution est de 3060x3960 pixels, en utilisant un espace colorimétrique RVB 16 bits.
  • La meilleure image sur la gauche a une taille de fichier de 337.879 octets (330 Ko) . Sa résolution est de 758x996 pixels en utilisant un espace colorimétrique Gray 8 bits.

Donc, pas besoin de redimensionner; ajoutez le drapeau -density. La valeur de densité 150 est étrange - essayer une plage de valeurs donne une image de qualité médiocre dans les deux sens!

339
JBWhitmore

Personnellement j'aime ça.

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

C'est un peu plus de deux fois 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 ayant 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 -sharpen ne fonctionnent pas bien avec du texte car elles annulent des choses que votre système de rendu de police a faites pour le rendre plus lisible.

Si vous souhaitez réellement l’agrandir, utilisez redimensionner ici et éventuellement une valeur dpi plus grande, par exemple targetDPI * scalingFactor, ce qui donnera le PDF à la résolution/taille souhaitée.

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

126
majinnaibu

J'utilise pdftoppm sur la ligne de commande pour obtenir l'image initiale, généralement avec une résolution de 300 dpi, donc pdftoppm -r 300, puis j'utilise convert pour effectuer le découpage et la conversion PNG.

15
Norman Ramsey

J'ai trouvé plus rapide et plus stable lors du traitement par lots de gros fichiers PDF en fichiers PNG et JPG d'utiliser la commande gs (alias Ghostscript) sous-jacente utilisée par convert.

Vous pouvez voir la commande dans la sortie de convert -verbose et il y a quelques modifications supplémentaires possibles (YMMV) qui sont difficiles/impossibles à accéder directement via convert.

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

13
Coder

Cela vous donne aussi de bons résultats:

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

Une autre suggestion est que vous pouvez utiliser GIMP. 

Il suffit de charger le fichier PDF dans GIMP-> Enregistrer au format .xcf pour pouvoir ensuite utiliser l'image que vous voulez.

2
Armin Mustafa

Utilisateur Linux ici: j'ai essayé l'utilitaire de ligne de commande convert (pour PDF en PNG) et les résultats ne m'ont pas satisfait. J'ai trouvé que c'était plus facile, avec un meilleur résultat:

  • extraire la ou les pages pdf avec pdftk
    • par exemple: pdftk file.pdf cat 3 output page3.pdf
  • ouvrir (importer) ce pdf avec GIMP
    • important: changez la variable Resolution de 100 en 300 ou 600 pixel/in
  • en exportation GIMP au format PNG (extension du fichier en .png)

Modifier:

Image ajoutée, comme demandé dans la 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 (par exemple, mon commentaire ci-dessous).

 pdf2png

 enter image description here

2
Victoria Stuart

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 effectuer une action Exécuter un 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 a Action rapide peuvent être téléchargés à partir de 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 __== '__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
benwiggy

J'utilise icepdf un moteur de code source ouvert Java. Vérifiez le démo du burea .

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 aussi essayé imagemagick et pdftoppm , pdftoppm et icepdf ont une résolution plus élevée que imagemagick.

0
Kris Roofe

Cela a parfaitement fonctionné pour moi

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

  1. Télécharger Programme de manipulation d'images GIMP
  2. Ouvrez le programme après l'installation
  3. Ouvrez le document PDF que vous souhaitez extraire des images
  4. Sélectionnez uniquement les pages du document PDF à partir duquel vous souhaitez extraire des 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 à partir desquelles vous souhaitez extraire des 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 s'affiche.
  9. Cliquez sur ** Exporter * pour exporter votre image à l'emplacement de votre choix.
  10. Vous pouvez ensuite vérifier votre explorateur de fichier pour l'image exportée.

C'est tout.

J'espère que ça aide.

Cette réponse peut être utile si elle peut aider, ou commentez ci-dessous pour plus de précisions.

0
Promise Preston

Utilisez cette ligne de commande:

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

Cela devrait convertir correctement le fichier que vous avez demandé.

0

Dans ImageMagick, vous pouvez faire du "super échantillonnage". Vous spécifiez une densité élevée, 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


 enter image description here

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 souhaitez effectuer un traitement ultérieur.

Si vous voulez que la sortie ait la même taille que l'entrée, redimensionnez-la à l'inverse du rapport entre votre densité et 72. Par exemple, -density 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.

0
fmw42

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

2JPEG peut convertir le fichier PDF que vous avez joint à un fichier JPG Nice sharpen et rogner les marges vides en un appel:

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

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

0
Jeff White