Ich versuche, das Befehlszeilenprogramm convert
zu verwenden, um eine PDF in ein Bild (JPEG oder PNG) aufzunehmen. Hier ist eines der PDFs das ich versuche zu konvertieren.
Ich möchte, dass das Programm die überschüssige Leerstelle abschneidet und ein qualitativ hochwertiges Bild liefert, damit die Superskripte problemlos gelesen werden können.
Dies ist mein aktueller bester Versuch . Wie Sie sehen, funktioniert das Trimmen gut, ich muss nur die Auflösung etwas erhöhen. Dies ist der Befehl, den ich verwende:
convert -trim 24.pdf -resize 500% -quality 100 -sharpen 0x1.0 24-11.jpg
Ich habe versucht, die folgenden bewussten Entscheidungen zu treffen:
-sharpen
(ich habe eine Reihe von Werten ausprobiert)Anregungen bitte, um die Auflösung des Bildes im endgültigen PNG/JPEG-Format zu erhöhen, wären sehr dankbar!
Es scheint, dass die folgenden Arbeiten funktionieren:
convert \
-verbose \
-density 150 \
-trim \
test.pdf \
-quality 100 \
-flatten \
-sharpen 0x1.0 \
24-18.jpg
Es ergibt sich zu dem linken Bild . Vergleichen Sie dies mit dem Ergebnis meines ursprünglichen Befehls ( das Bild rechts ):
(Um wirklich die Unterschiede zwischen den beiden zu sehen und zu schätzen, klicken Sie mit der rechten Maustaste darauf und wählen Sie "Bild in neuem Tab öffnen".
Beachten Sie auch die folgenden Fakten:
Also keine Notwendigkeit, die Größe zu ändern; Fügen Sie das Flag -density
hinzu. Der Dichtewert 150 ist seltsam - der Versuch eines Wertebereichs führt zu einem schlechter aussehenden Bild in beide Richtungen!
Persönlich gefällt mir das.
convert -density 300 -trim test.pdf -quality 100 test.jpg
Es ist etwas mehr als doppelt so groß wie die Dateigröße, aber es sieht für mich besser aus.
-density 300
legt die dpi fest, mit der PDF gerendert wird.
-trim
entfernt alle Randpixel, die dieselbe Farbe wie die Eckpixel haben.
-quality 100
setzt die JPEG-Komprimierungsqualität auf die höchste Qualität.
Dinge wie -sharpen
funktionieren nicht gut mit Text, da sie die Dinge rückgängig machen, die Ihr Font-Rendering-System getan hat, um es lesbarer zu machen.
Wenn Sie es wirklich in die Luft sprengen möchten, verwenden Sie hier die Größenänderung und möglicherweise einen größeren dpi-Wert von targetDPI * scalingFactor
. Dadurch wird PDF mit der Auflösung/Größe gerendert, die Sie beabsichtigen.
Beschreibungen der Parameter auf imagemagick.org sind hier
Ich verwende pdftoppm
in der Befehlszeile, um das Ausgangsbild zu erhalten, normalerweise mit einer Auflösung von 300 dpi, also pdftoppm -r 300
, und dann convert
zum Trimmen und zur PNG-Konvertierung.
Ich habe es sowohl schneller als auch stabiler gefunden, wenn große PDFs in Batches in PNGs und JPGs verarbeitet werden, um den zugrunde liegenden gs
(alias Ghostscript) -Befehl zu verwenden, den convert
verwendet.
Sie können den Befehl in der Ausgabe von convert -verbose
sehen, und es sind einige weitere Änderungen (YMMV) möglich, auf die über convert
ein direkter Zugriff nicht möglich ist.
Es ist jedoch schwieriger, das Trimmen und Schärfen mit gs
durchzuführen, also, wie gesagt, YMMV!
normalerweise extrahiere ich das eingebettete Bild mit 'pdfimages' in der nativen Auflösung und verwende dann ImageMagicks Konvertierung in das benötigte Format:
$ pdfimages -list fileName.pdf
$ pdfimages fileName.pdf fileName # save in .ppm format
$ convert fileName-000.ppm fileName-000.png
dies erzeugt die beste und kleinste Ergebnisdatei.
Hinweis: Für verlustbehaftete JPG-Bilder mussten Sie -j verwenden:
$ pdfimages -j fileName.pdf fileName # save in .jpg format
Mit dem letzten Poppler können Sie -all verwenden, das verlustbehaftet als jpg und verlustfrei als png speichert
Auf der wenig bereitgestellten Win-Plattform mussten Sie ein aktuelles (0.37 2015) "poppler-util" -binäres Programm herunterladen: http://blog.alivate.com.au/poppler-windows/
Es gibt auch gute Ergebnisse:
exec("convert -geometry 1600x1600 -density 200x200 -quality 100 test.pdf test_image.jpg");
Ein weiterer Vorschlag ist, dass Sie GIMP verwenden können.
Laden Sie einfach die PDF -Datei in GIMP-> Speichern als .xcf und Sie können dann alles tun, was Sie möchten.
Linux-Benutzer hier: Ich habe das convert
-Befehlszeilenprogramm (für PDF für PNG) ausprobiert und war mit den Ergebnissen nicht zufrieden. Ich fand das einfacher, mit einem besseren Ergebnis:
pdftk file.pdf cat 3 output page3.pdf
GIMP
Resolution
von 100
in 300
oder 600 pixel/in
.GIMP
als PNG exportieren (Dateierweiterung in .png ändern)Bearbeiten:
Bild hinzugefügt, wie in der Comments
angefordert. Konvertierter Befehl verwendet:
convert -density 300 -trim struct2vec.pdf -quality 100 struct2vec.png
GIMP
: importiert mit 300 dpi (px/in); als PNG-Komprimierungsstufe 3 exportiert.
Ich habe GIMP in der Befehlszeile nicht verwendet (siehe unten: mein Kommentar).
Das folgende Python-Skript funktioniert auf jedem Mac (Snow Leopard und höher). Es kann in der Befehlszeile mit aufeinanderfolgenden PDF -Dateien als Argumente verwendet werden, oder Sie können in Automator eine Aktion "Shell-Skript ausführen" ausführen und einen Dienst erstellen (Schnellaktion in Mojave).
Sie können die Auflösung des Ausgabebildes im Skript einstellen.
Das Skript und eine Schnellaktion können von github heruntergeladen werden.
#!/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
Ich benutze icepdf eine Open Source Java PDF-Engine. Überprüfen Sie die Office-Demo .
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();
}
}
Ich habe auch versucht imagemagick und pdftoppm , sowohl pdftoppm als auch icepdf haben eine höhere Auflösung als imagemagick.
Das hat bei mir einwandfrei funktioniert
Befolgen Sie diese einfachen Schritte, um Bilder in einem beliebigen Format aus PDF Dokumenten zu extrahieren
Das ist alles.
Ich hoffe das hilft.
Erweitere diese Antwort als nützlich, wenn es hilft, oder kommentiere sie unter der Antwort, um mehr Klarheit zu schaffen.
Verwenden Sie diese Befehlszeile:
convert -geometry 3600x3600 -density 300x300 -quality 100 TEAM\ 4.pdf team4.png
Dies sollte die Datei korrekt konvertieren, wie Sie gefragt haben.
In ImageMagick können Sie "Supersampling" durchführen. Sie geben eine große Dichte an und verkleinern sie dann so weit, wie es für die endgültige Ausgabegröße erforderlich ist. Zum Beispiel mit Ihrem Bild:
convert -density 600 test.pdf -background white -flatten -resize 25% test.png
Laden Sie das Bild herunter, um es zum Vergleich in voller Auflösung anzuzeigen.
Ich empfehle nicht, in JPG zu speichern, wenn Sie eine weitere Verarbeitung erwarten.
Wenn Sie möchten, dass die Ausgabe dieselbe Größe wie die Eingabe hat, ändern Sie die Größe in den Kehrwert des Verhältnisses Ihrer Dichte zu 72. Beispiel: -density 288 und -resize 25%. 288 = 4 * 72 und 25% = 1/4
Je höher die Dichte, desto besser die resultierende Qualität. Die Verarbeitung dauert jedoch länger.
Die angehängte PNG-Datei sieht sehr unscharf aus. Wenn Sie für jedes als PDF -Vorschau erzeugte Bild eine zusätzliche Nachbearbeitung verwenden müssen, verringern Sie die Leistung Ihrer Lösung.
2JPEG kann PDF -Datei konvertieren, die Sie an eine Nice-Schärf-JPG-Datei angehängt haben, und leere Ränder in einem Aufruf zuschneiden:
2jpeg.exe -src "C:\In\*.*" -dst "C:\Out" -oper Crop method:autocrop
Mit der Vorschau auf einem Mac ist das eigentlich ganz einfach. Sie müssen lediglich die Datei in der Vorschau öffnen und ein PNG- oder JPEG-Bild speichern (oder exportieren). Stellen Sie jedoch sicher, dass Sie am unteren Rand des Fensters mindestens 300 dpi verwenden, um ein qualitativ hochwertiges Bild zu erhalten.