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:
-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!
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:
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!
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
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.
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!
Cela vous donne aussi de bons résultats:
exec("convert -geometry 1600x1600 -density 200x200 -quality 100 test.pdf test_image.jpg");
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.
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:
pdftk file.pdf cat 3 output page3.pdf
GIMP
Resolution
de 100
en 300
ou 600 pixel/in
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).
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
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.
Cela a parfaitement fonctionné pour moi
Suivez ces étapes simples pour extraire des images de n’importe quel format à partir de PDF documents
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.
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é.
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
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.
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
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é.