PDFを高解像度の画像に変換


328

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

プログラムで余計な空白を取り除き、上付き文字が簡単に読み取れる十分な高品質の画像を返すようにしたいと思います。

これが私の現在の最善の試みです。ご覧のとおり、トリミングは正常に機能しています。解像度をかなりシャープにする必要があるだけです。これは私が使用しているコマンドです:

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

私は次の意識的な決定をすることを試みました:

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

最終的なPNG / JPEGで画像の解像度を高くするための提案があれば、大歓迎です!


わかりません。リンクを試すこともできます...
karnok '07 / 07/01

1
次も参照してください:askubuntu.com/a/50180/64957
デイブジャービス

Macを使用している場合は、「スクリプト可能な画像処理システム」のmanページご覧くださいsips。これは、macOSに組み込まれたコマンドライン画像エディターで、PDFやその他の多くの画像タイプで動作します。
ghoti 2018

@ghoti sipsはPDFファイルの最初のページのみを画像に変換します。
benwiggy

回答:


386

次のように機能するようです:

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

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

  

(2つの違いを実際に確認して理解するには、それぞれを右クリックして[ 新しいタブで画像を開く... ]を選択します。)

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

  • 右側のより悪い、ぼやけた画像のファイルサイズは1.941.702バイト(1.85 Mバイト)です。その解像度は、16ビットRGB色空間を使用した3060x3960ピクセルです。
  • 左側のより鮮明な画像のファイルサイズは337.879バイト(330 kByte)です。その解像度は758x996ピクセルで、8ビットのグレー色空間を使用します。

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


77
densityパラメータは、その中のビット特別なものでなければなりませんである前に、入力ファイル。PDFはピクセルベースの(ほとんどの)概念を持たないベクトルベースのファイル形式であるため、「ページは8インチx 12インチです」のようなものです。ピクセルが必要な場合は、density設定を使用して、出力に取得する1インチあたりのピクセル数を指定します。例:150の場合、結果の画像では8x150 = 1200 x 12x150 = 1800ピクセルになります。これは、シャープ、コントラスト、圧縮などの設定が機能するピクセルの量でもあります。
Daniel Schneller、2013

8
Mac OSで背景が黒くなる場合があります(stackoverflow.com/questions/10934456/…を参照)。これを修正するには、を追加し-flattenます。
ロルフ

2
pdfをpngに変換しようとすると、Mac OSで背景が黒くなり、-flattenを追加して解決しました。
オララ

4
うわー!-densityand -flattenオプションを使用して、PDFのサイズを(別のPDFに)縮小しました。この-flattenオプションは、合計サイズの削減に非常に役立ちます。私の場合、視覚障害なし。
2016年

2
-density開始画像の品質がより低かった場合、フラグは、おそらくより高い値に悪い結果を与えるであろう。
2016年

153

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

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

ファイルサイズの2倍強ですが、私には見た目が良くなっています。

-density 300 PDFがレンダリングされるdpiを設定します。

-trim コーナーピクセルと同じ色のエッジピクセルを削除します。

-quality 100 JPEG圧縮品質を最高品質に設定します。

など-sharpenは、フォントレンダリングシステムがテキストを読みやすくするために行った処理を取り消すため、テキストではうまく機能しません。

実際に拡大したい場合は、ここでサイズ変更を使用します。おそらく、dpi値を大きくtargetDPI * scalingFactor すると、意図した解像度/サイズでPDFがレンダリングされます。

imagemagick.orgのパラメーターの説明はこちら


これは主に出力密度が2倍になり、jpg圧縮品質が最大に設定されているため、サイズが2倍になります(あまり圧縮されません)。
rivimey 2015

convertどのように使用して、変換されたページ数を知ることができますか?
キランレディ2017年

ええと、これは間違いなく行く方法です。そのソース密度を上げて、を削除し-sharpenます。品質はデフォルトよりもはるかに優れており、を使用するよりもはるかに自然です-sharpen
Joshua Pinter

19

pdftoppmコマンドラインでを使用して、通常300dpiの解像度で初期画像を取得してからpdftoppm -r 300、を使用convertしてトリミングとPNG変換を行います。


1
Imagemagickを使用しない場合、このソリューションは透過的な変換の精神に最も当てはまります。pdftoppmJPEGおよびPNGも出力できます。
Aaron Brick

19

通常、ネイティブの解像度で「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プラットフォームでは、http://blog.alivate.com.au/poppler-windows/から最近(0.37 2015)の「poppler-util」バイナリをダウンロードする必要がありました。


ほんの小さな修正:最初のコードブロックの2番目のコマンドは、次のpdftoppmpdfimages
文字で

いいえ、古いpdfimagesは抽出された画像をpdftoppmのようにppmに保存し、pdftoppmには-listオプションがありませんでした。現在のpdfimagesは、ノートに記載されている-allを使用して、PNGおよびJPGに直接保存できます
Valerio

13

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

の出力でコマンドを見ることができconvert -verbose、そこから直接アクセスすることが難しい/不可能である、いくつかの可能な微調整(YMMV)がありますconvert

ただし、を使用してトリミングとシャープを行うのは難しいためgs、先ほど述べたように、YMMVを使用します。



7

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

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

編集:

で要求された画像を追加Comments。使用する変換コマンド:

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

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

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

pdf2png

ここに画像の説明を入力してください


1
何千ものページがある場合、これを自動化できますか?
JBWhitmore 2017

@JBWhitmore:いい質問です。確かに、pdftkコマンドは既にコマンドラインにあるため、スクリプトを記述するのは簡単です。私は本当に素早いGoogle検索を行ったところ、GIMPにバッチモードがあることを発見しました(私は試していませんが、それもスクリプト可能である必要があります):gimp.org/tutorials/Basic_Batch
Victoria Stuart

1
この変換を自動化するスクリプトの例@JBWhitmoreこの質問/答えに表示されます:unix.stackexchange.com/questions/121293/...
tsherwen

1
@tsherwen、そのリンクを正しく読んだ場合、それは変換コマンドを自動化する方法です。私はそれを行う方法について混乱していません。ただし、この回答はGIMPをステップの1つとして使用することを示しています。この回答もリンクも自動化の方法を示していないようです。
JBWhitmore

1
@JBWhitmore。私は誤ってに関する質問を考えていましたconvertconvert自動化のコメントを読みながら、私はこの回答の一部とあなたの質問に言及するのを見ました。このスレッドで後で回答していただきありがとうございます。これは、私がリンクしたソリューションと組み合わせて、私が抱えていた別の問題を解決しました。
tsherwen

7

私はconvert[2020年5月の更新:実際:それはほとんど機能しません]で本当に成功していませんが、で非常に成功していpdftoppmます。PDFから高品質の画像を作成する例をいくつか示します。

  1. [1 pgあたり〜25 MBサイズのファイルを生成します] 300 DPIの非圧縮.tifファイル形式をpg-1.tifpg-2.tifpg-3.tifという名前の「イメージ」という名前のフォルダーに出力します。等:

    mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [1 pgあたり〜1MBサイズのファイルを生成] 300 DPI.jpg形式で出力:

    mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  3. [1 pgあたり〜2MBサイズのファイルを生成します] 最高の品質(最小の圧縮).jpg形式出力しますが、300 DPIのままです。

    mkdir -p images && pdftoppm -jpeg -jpegopt quality=100 -r 300 mypdf.pdf images/pg
    

詳細な説明、オプション、および例については、ここで私の完全な回答を参照してください:

/ubuntu/150100/extracting-embedded-images-from-a-pdf/1187844#1187844

関連:

  1. [PDFを検索可能なPDFに変換する方法pdf2searchablepdf] /ubuntu/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. 相互リンク:
    1. Linuxでコマンドラインを使用してPDFをJPGに変換する方法は?
    2. /unix/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574

6

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

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


3

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

GIMPにPDFファイルをロードするだけで、.xcfとして保存すれば、画像に対してやりたいことが何でもできます。


9
コマンドラインからこれを行う理由は、このプロセスを必要とする何千ものページがあったためです。
JBWhitmore 2013年

また、GIMPは読み込み時にページをレンダリングするため、読み込むページを選択するときに解像度を設定する必要があります。ロード時にデフォルトの100 DPIで開始する場合、出力パラメーターを何に設定するかは重要ではありません。
キースデイビス

1

私はicepdfをオープンソースのJava PDFエンジンとして使用しています。オフィスのデモを確認してください。

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よりも解像度が高くなっています。


1

投票する前に注意してください。このソリューションは、グラフィカルインターフェイスを使用するGimp用であり、コマンドラインを使用するImageMagick用ではありませんが、代替案としては完全に問題なく機能したため、ここで共有する必要があると思いました。

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

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

それで全部です。

これが役に立てば幸い


問題は、コマンドラインを使用するImageMagickに対するもので、グラフィカルインターフェイスを使用するGimpに対するものではありません。
シドニー

0

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

2JPEGは、添付したPDFファイルをシャープなJPGに変換し、1回の呼び出しで空の余白をトリミングできます。

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

元のPNGのぼやけは、そもそも問題を引き起こしたものであり、受け入れられた回答のPNGはかなりはっきりしています。
JBWhitmore 2014年

0

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

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

これにより、要求どおりにファイルが正しく変換されます。


0

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

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

スクリプト迅速な行動が 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 __name__ == '__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

LibreOffice Draw(通常はUbuntuにプリインストールされています)で実行できます。

  1. LibreOffice DrawでPDFファイルを開きます。
  2. 必要なページまでスクロールします。
  3. 確認してくださいテキスト/画像要素が正しく配置されて。そうでない場合は、ページで調整/編集できます。
  4. トップメニュー:ファイル>エクスポート...
  5. 右下のメニューで必要な画像形式を選択します。PNGをお勧めします。
  6. ファイルに名前を付けて、[保存]をクリックします。
  7. オプションウィンドウが表示されるので、解像度とサイズを調整できます。
  8. [OK]をクリックして完了です。

0

私はpdf2imageを使用しました。魅力のように機能するシンプルなPythonライブラリ。

最初に、Linux以外のマシンにpopplerをインストールします。zipをダウンロードするだけです。プログラムファイルを解凍し、マシンパスにビンを追加します。

その後、次のようにpythonクラスでpdf2imageを使用できます。

from pdf2image import convert_from_path, convert_from_bytes
images_from_path = convert_from_path(
   inputfile,
   output_folder=outputpath,
   grayscale=True, fmt='jpeg')

私はpythonが苦手ですが、exeを作成できました。後で、ファイル入力および出力パラメーターを指定してexeを使用できます。私はC#で使用しており、問題なく動作しています。

画質は良好です。OCRは正常に機能します。


-1

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


6
何千ものページがある場合、これを自動化できますか?
JBWhitmore
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.