web-dev-qa-db-ja.com

変換する PDF 高解像度で撮影する

私はコマンドラインプログラム convert を使ってPDFを画像(JPEGまたはPNG)に取り込もうとしています。これが PDFの1つ です。/ /変換しようとしています。

余分な空白を削除して、上付き文字が簡単に読めるように十分に高品質の画像を返すようにプログラムに指示します。

これが私の現在の 最善の試み です。ご覧のとおり、トリミングはうまく機能しています。解像度をかなり大きくする必要があります。これは私が使っているコマンドです:

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

私は以下の意識的な決断をしようとしました:

  • サイズを大きくする(解像度には影響しません)
  • できるだけ品質を高くする
  • -sharpenを使います(私は値の範囲を試しました)

最終的なPNG/JPEGの画像の解像度を高くすることについてのご提案は大歓迎です。

278
JBWhitmore

次のように動作します。

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

その結果、 左の画像 となります。これを私の元のコマンドの結果と比較してください( 右側の画像 ):

(To本当に2つの違いを確認し、それぞれを右クリックして"新しいタブで画像を開く..."を選択します。

また、次の点に留意してください。

  • 右側の最悪、ぼやけた画像のファイルサイズは1.941.702バイト(1.85 MB)です。その解像度は16ビットRGBカラースペースを使用して、3060 x 3960ピクセルです。
  • 左側のより鮮明な画像のファイルサイズは337.879バイト(330キロバイト)です。解像度は758x996ピクセルで、8ビットのグレーカラースペースを使用しています。

そのため、サイズを変更する必要はありません。 -densityフラグを追加してください。濃度値150は奇妙です - ある範囲の値を試すと、両方向の画像が悪くなります。

345
JBWhitmore

個人的に私はこれが好きです。

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のパラメータの説明は ここ です。

131
majinnaibu

最初の画像を取得するにはコマンドラインでpdftoppmを使用します。通常は300dpiの解像度です。したがってpdftoppm -r 300を使用し、次にconvertを使用してトリミングとPNG変換を行います。

15
Norman Ramsey

通常、私はネイティブの解像度で '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/ /

14
Valerio

大きなPDFをPNGとJPGにバッチ処理する際に、gsが使用する基礎となるconvert(別名Ghostscript)コマンドを使用すると、より速く、より安定したものになります。

convert -verboseの出力にコマンドが表示されますが、convert経由で直接アクセスするのは困難/不可能な、さらにいくつかの調整が可能です(YMMV)。

しかし、gsを使ってトリミングやシャープ化を行うのは難しいでしょう。それで、私が言ったように、YMMV!

13
Coder

それはまたあなたに良い結果を与えます:

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

Linuxユーザーはこちら:convertコマンドラインユーティリティ(PNGへのPDF用)を試してみましたが、結果に満足できませんでした。私はこれがより簡単で、より良い結果が得られることを発見しました:

  • pdftk でpdfページを抽出してください
    • 例:pdftk file.pdf cat 3 output page3.pdf
  • そのpdfをGIMP で開く(インポートする)
    • 重要:インポートのResolution100から300または600 pixel/inに変更してください。
  • pNGとしてのGIMPエクスポート(ファイル拡張子を.pngに変更)

編集:

Commentsで要求されているように、写真を追加しました。使用される変換コマンド:

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

GIMP:300 dpi(px/in)でインポートされました。 PNG圧縮レベル3としてエクスポートされます。

私はGIMPをコマンドラインで使っていません(以下のコメントを参照)。

pdf2png

enter image description here

4
Victoria Stuart

もう1つの提案は、GIMPを使うことができるということです。

GIMP->。_cfにPDFファイルをロードするだけで、.xcfという名前で保存して、画像に必要なことを何でも実行できます。

2
Armin Mustafa

次のPythonスクリプトはどのMac(Snow Leopard以降)でも動作します。引数として連続するPDFファイルを使用してコマンドラインで使用することも、AutomatorのRun Shell Scriptアクションに入れてサービスを作成することもできます(Mojaveのクイックアクション)。

スクリプトで出力画像の解像度を設定できます。

scriptQuick 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
0
benwiggy

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

imagemagickpdftoppm も試しました。pdftoppmとicepdfはどちらもimagemagickよりも高い解像度を持っています。

0
Kris Roofe

これは私にとって完璧に機能しました

これらの簡単な手順に従って、PDFドキュメントから任意の形式の画像を抽出します

  1. ダウンロードGIMP画像操作プログラム
  2. インストール後にプログラムを開きます
  3. 画像を抽出するPDFドキュメントを開きます
  4. 画像を抽出するPDFドキュメントのページのみを選択します。 N/B:カバー画像のみが必要な場合は、最初のページのみを選択します。
  5. 画像を抽出するページを選択した後、開くをクリックします
  6. ページが開いたときにGIMPのときにFileメニューをクリックします
  7. [ファイル]メニューで[としてエクスポート]を選択します
  8. 表示されるダイアログボックスの下で、拡張子(たとえばpng)によって好みのファイルタイプを選択します。
  9. [**エクスポート*]をクリックして、画像を目的の場所にエクスポートします。
  10. その後、エクスポートされた画像のファイルエクスプローラーを確認できます。

それで全部です。

これがお役に立てば幸いです。

役立つ場合はこの回答を役立ててください。または、より明確にするために回答の下にコメントしてください。

0
Promise Preston

次のコマンドラインを使用します。

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


enter image description here

比較のためにフル解像度で表示するには画像をダウンロードしてください。

あなたがさらなる処理をすることを期待しているならば、私はJPGに保存することを勧めません。

出力を入力と同じサイズにする場合は、密度と72の比率の逆数にサイズ変更します。たとえば、-density 288と-resize 25%です。 288 = 4 * 72、25%= 1/4

密度が大きいほど品質は良くなりますが、処理に時間がかかります。

0
fmw42

添付したPNGファイルは本当にぼやけて見えます。 PDF previewとして生成した画像ごとに追加の後処理を使用する必要がある場合は、ソリューションのパフォーマンスが低下します。

2JPEG あなたが添付したPDFファイルをNice sharpen JPGに変換し、空のマージンを一回の呼び出しでトリミングすることができます:

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

Mac上でプレビューするのは実に簡単です。プレビューでファイルを開いてpngまたはjpegで名前を付けて保存(またはエクスポート)するだけですが、高品質の画像を取得するにはウィンドウの下部に少なくとも300 dpiを使用するようにしてください。

0
Jeff White