私はコマンドラインプログラム convert
を使ってPDFを画像(JPEGまたはPNG)に取り込もうとしています。これが PDFの1つ です。/ /変換しようとしています。
余分な空白を削除して、上付き文字が簡単に読めるように十分に高品質の画像を返すようにプログラムに指示します。
これが私の現在の 最善の試み です。ご覧のとおり、トリミングはうまく機能しています。解像度をかなり大きくする必要があります。これは私が使っているコマンドです:
convert -trim 24.pdf -resize 500% -quality 100 -sharpen 0x1.0 24-11.jpg
私は以下の意識的な決断をしようとしました:
-sharpen
を使います(私は値の範囲を試しました)最終的なPNG/JPEGの画像の解像度を高くすることについてのご提案は大歓迎です。
次のように動作します。
convert \
-verbose \
-density 150 \
-trim \
test.pdf \
-quality 100 \
-flatten \
-sharpen 0x1.0 \
24-18.jpg
その結果、 左の画像 となります。これを私の元のコマンドの結果と比較してください( 右側の画像 ):
(To本当に2つの違いを確認し、それぞれを右クリックして"新しいタブで画像を開く..."を選択します。
また、次の点に留意してください。
そのため、サイズを変更する必要はありません。 -density
フラグを追加してください。濃度値150は奇妙です - ある範囲の値を試すと、両方向の画像が悪くなります。
個人的に私はこれが好きです。
convert -density 300 -trim test.pdf -quality 100 test.jpg
ファイルサイズの2倍強ですが、見栄えがよくなります。
-density 300
は、PDFがレンダリングされるdpiを設定します。
-trim
は、コーナーピクセルと同じ色のエッジピクセルを削除します。
-quality 100
はJPEG圧縮品質を最高品質に設定します。
-sharpen
のようなものはあなたのフォントレンダリングシステムがそれをより読みやすくするためにしたことを元に戻すのでテキストとうまく動作しません。
実際に拡大したい場合は、ここでリサイズを使用し、おそらくtargetDPI * scalingFactor
のようなより大きなdpi値を使用すると、意図した解像度/サイズでPDFがレンダリングされます。
Imagemagick.orgのパラメータの説明は ここ です。
最初の画像を取得するにはコマンドラインでpdftoppm
を使用します。通常は300dpiの解像度です。したがってpdftoppm -r 300
を使用し、次にconvert
を使用してトリミングとPNG変換を行います。
通常、私はネイティブの解像度で 'pdfimages'を使って埋め込み画像を抽出し、それから必要なフォーマットへのImageMagickの変換を使います:
$ pdfimages -list fileName.pdf
$ pdfimages fileName.pdf fileName # save in .ppm format
$ convert fileName-000.ppm fileName-000.png
これにより、最良と最小の結果ファイルが生成されます。
注:損失の大きいJPG埋め込み画像の場合は、-jを使用する必要がありました。
$ pdfimages -j fileName.pdf fileName # save in .jpg format
最近のpopplerでは、-allを使用して、損失をjpgとして、損失なしをpngとして保存することができます。
ほとんど提供されていないWinプラットフォームでは、最新の(0.37 2015) 'poppler-util'バイナリを次の場所からダウンロードする必要がありました: http://blog.alivate.com.au/poppler-windows/ /
大きなPDFをPNGとJPGにバッチ処理する際に、gs
が使用する基礎となるconvert
(別名Ghostscript)コマンドを使用すると、より速く、より安定したものになります。
convert -verbose
の出力にコマンドが表示されますが、convert
経由で直接アクセスするのは困難/不可能な、さらにいくつかの調整が可能です(YMMV)。
しかし、gs
を使ってトリミングやシャープ化を行うのは難しいでしょう。それで、私が言ったように、YMMV!
それはまたあなたに良い結果を与えます:
exec("convert -geometry 1600x1600 -density 200x200 -quality 100 test.pdf test_image.jpg");
Linuxユーザーはこちら:convert
コマンドラインユーティリティ(PNGへのPDF用)を試してみましたが、結果に満足できませんでした。私はこれがより簡単で、より良い結果が得られることを発見しました:
pdftk file.pdf cat 3 output page3.pdf
GIMP
で開く(インポートする)Resolution
を100
から300
または600 pixel/in
に変更してください。GIMP
エクスポート(ファイル拡張子を.pngに変更)編集:
Comments
で要求されているように、写真を追加しました。使用される変換コマンド:
convert -density 300 -trim struct2vec.pdf -quality 100 struct2vec.png
GIMP
:300 dpi(px/in)でインポートされました。 PNG圧縮レベル3としてエクスポートされます。
私はGIMPをコマンドラインで使っていません(以下のコメントを参照)。
もう1つの提案は、GIMPを使うことができるということです。
GIMP->。_cfにPDFファイルをロードするだけで、.xcfという名前で保存して、画像に必要なことを何でも実行できます。
次のPythonスクリプトはどのMac(Snow Leopard以降)でも動作します。引数として連続するPDFファイルを使用してコマンドラインで使用することも、AutomatorのRun Shell Scriptアクションに入れてサービスを作成することもできます(Mojaveのクイックアクション)。
スクリプトで出力画像の解像度を設定できます。
script と Quick Action は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
icepdf オープンソースJava pdfエンジンを使用します。 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();
}
}
imagemagick と pdftoppm も試しました。pdftoppmとicepdfはどちらもimagemagickよりも高い解像度を持っています。
これは私にとって完璧に機能しました
これらの簡単な手順に従って、PDFドキュメントから任意の形式の画像を抽出します
それで全部です。
これがお役に立てば幸いです。
役立つ場合はこの回答を役立ててください。または、より明確にするために回答の下にコメントしてください。
次のコマンドラインを使用します。
convert -geometry 3600x3600 -density 300x300 -quality 100 TEAM\ 4.pdf team4.png
これにより、要求どおりにファイルが正しく変換されます。
ImageMagickでは、「スーパーサンプリング」を実行できます。大きな密度を指定してから、最終的な出力サイズに合わせてサイズを変更します。例えばあなたの画像では:
convert -density 600 test.pdf -background white -flatten -resize 25% test.png
比較のためにフル解像度で表示するには画像をダウンロードしてください。
あなたがさらなる処理をすることを期待しているならば、私はJPGに保存することを勧めません。
出力を入力と同じサイズにする場合は、密度と72の比率の逆数にサイズ変更します。たとえば、-density 288と-resize 25%です。 288 = 4 * 72、25%= 1/4
密度が大きいほど品質は良くなりますが、処理に時間がかかります。
添付したPNGファイルは本当にぼやけて見えます。 PDF previewとして生成した画像ごとに追加の後処理を使用する必要がある場合は、ソリューションのパフォーマンスが低下します。
2JPEG あなたが添付したPDFファイルをNice sharpen JPGに変換し、空のマージンを一回の呼び出しでトリミングすることができます:
2jpeg.exe -src "C:\In\*.*" -dst "C:\Out" -oper Crop method:autocrop
Mac上でプレビューするのは実に簡単です。プレビューでファイルを開いてpngまたはjpegで名前を付けて保存(またはエクスポート)するだけですが、高品質の画像を取得するにはウィンドウの下部に少なくとも300 dpiを使用するようにしてください。