だから私がリリースしている状態はPDF形式でデータの束を公開しているが、さらに悪いことに、PDFのほとんど(すべて?)はOfficeで入力された文字、印刷/ファックス、それからスキャンします(私たちの政府は最高でしょうか?)最初は気が狂っていると思っていましたが、その後、誰かがスキャナーに適切に入れなかったように、「傾斜」した多数のpdfを目にし始めました。実際のテキストを取得するための次善策は、各ページを画像にすることです。
明らかにこれは自動化する必要があり、可能であればPythonに固執することを望みます。RubyまたはPerlに実装があまりにもすごすぎる場合私はpyPDFをテキスト抽出に試しましたが、それは明らかに私にはあまり役に立たなかったのです。swftoolsを試しましたが、そこから得られる画像はまったく使用できません。変換時にフォントが台無しになっているように見えますが、比較的軽量で読みやすいのであれば、途中での画像形式についてはあまり気にしません。
PDFが本当にスキャンされた画像である場合、PDFを画像に変換しないでください。PDFから画像を抽出する必要があります。ほとんどの場合、PDF内のすべてのデータは本質的に1つの巨大な画像であり、PDF冗長性でラップされてAcrobatで読み取り可能になっています。
PDF内の画像を見つけてバイトをコピーするという単純な手段を試してみてください: PDFからのJPGの抽出 。そこにあるコードは非常にシンプルで、おそらくPDFファイルでは機能しない理由がたくさんあります。ただし、その場合は、PDFファイルから画像データをすばやく簡単に取得できます。
あなたは、例えば呼び出すことができますコマンドラインから(またはPythonのpdftoppm
モジュールを使用して)subprocess
し、ImageMagickなどを使用して、結果のPPM=ファイルを目的の形式に変換します。 subprocess
または存在する場合はいくつかのバインディング)。
Ghostscriptは、PDFファイルを画像に変換するのに理想的です。信頼性が高く、多くの設定可能なオプションがあります。GPLライセンスまたは商用ライセンスでも利用可能です。コマンドラインから呼び出すか、ネイティブAPI詳細情報:
.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ページのパスの場所を示します。別のページを取得する必要がある場合、パスを変更して前のページを取得するロジックを簡単に追加できます