web-dev-qa-db-ja.com

PDF=イメージへの自動変換

だから私がリリースしている状態はPDF形式でデータの束を公開しているが、さらに悪いことに、PDFのほとんど(すべて?)はOfficeで入力された文字、印刷/ファックス、それからスキャンします(私たちの政府は最高でしょうか?)最初は気が狂っていると思っていましたが、その後、誰かがスキャナーに適切に入れなかったように、「傾斜」した多数のpdfを目にし始めました。実際のテキストを取得するための次善策は、各ページを画像にすることです。

明らかにこれは自動化する必要があり、可能であればPythonに固執することを望みます。RubyまたはPerlに実装があまりにもすごすぎる場合私はpyPDFをテキスト抽出に試しましたが、それは明らかに私にはあまり役に立たなかったのです。swftoolsを試しましたが、そこから得られる画像はまったく使用できません。変換時にフォントが台無しになっているように見えますが、比較的軽量で読みやすいのであれば、途中での画像形式についてはあまり気にしません。

31
f4nt

PDFが本当にスキャンされた画像である場合、PDFを画像に変換しないでください。PDFから画像を抽出する必要があります。ほとんどの場合、PDF内のすべてのデータは本質的に1つの巨大な画像であり、PDF冗長性でラップされてAcrobatで読み取り可能になっています。

PDF内の画像を見つけてバイトをコピーするという単純な手段を試してみてください: PDFからのJPGの抽出 。そこにあるコードは非常にシンプルで、おそらくPDFファイルでは機能しない理由がたくさんあります。ただし、その場合は、PDFファイルから画像データをすばやく簡単に取得できます。

12
Ned Batchelder

あなたは、例えば呼び出すことができますコマンドラインから(またはPythonのpdftoppmモジュールを使用して)subprocessし、ImageMagickなどを使用して、結果のPPM=ファイルを目的の形式に変換します。 subprocessまたは存在する場合はいくつかのバインディング)。

8
Antoine P.

Ghostscriptは、PDFファイルを画像に変換するのに理想的です。信頼性が高く、多くの設定可能なオプションがあります。GPLライセンスまたは商用ライセンスでも利用可能です。コマンドラインから呼び出すか、ネイティブAPI詳細情報:

5
Scott Willeke

.pdfファイルを画像に変換する別の方法を次に示します。画像プリンターを使用します。 ImagePrinter Pro を使用して、以下の関数を使用してpdfをjpegイメージに「印刷」することに成功しました。ただし、多くの画像プリンタがあります。好きなものを選んでください。選択したイメージプリンターとイメージプリンターが使用する標準のファイル保存形式に基づいて、コードの一部をわずかに変更する必要がある場合があります。

import win32api
import os

def pdf_to_jpg(pdfPath, pages):
    # print pdf using jpg printer
    # 'pages' is the number of pages in the pdf
    filepath = pdfPath.rsplit('/', 1)[0]
    filename = pdfPath.rsplit('/', 1)[1]

    #print pdf to jpg using jpg printer
    tempprinter = "ImagePrinter Pro"
    printer = '"%s"' % tempprinter
    win32api.ShellExecute(0, "printto", filename, printer,  ".",  0)

    # Add time delay to ensure pdf finishes printing to file first
    fileFound = False
    if pages > 1:
        jpgName = filename.split('.')[0] + '_' + str(pages - 1) + '.jpg'
    else:
        jpgName = filename.split('.')[0] + '.jpg'
    jpgPath = filepath + '/' + jpgName
    waitTime = 30
    for i in range(waitTime):
        if os.path.isfile(jpgPath):
            fileFound = True
            break
        else:
            time.sleep(1)

    # print Error if the file was never found
    if not fileFound:
        print "ERROR: " + jpgName + " wasn't found after " + str(waitTime)\
              + " seconds"

    return jpgPath

結果のjpgPath変数は、印刷されたPDFの最後のjpegページのパスの場所を示します。別のページを取得する必要がある場合、パスを変更して前のページを取得するロジックを簡単に追加できます

1
Jed