web-dev-qa-db-ja.com

Python:pdfからページをjpegとして抽出する

pythonコードで、pdfの特定のページをjpegファイルとして効率的に保存する方法は? (ユースケース:pdf-sがアップロードされ、各ページに対応するjpeg-sが格納されるpython flask Webサーバーを持っています。)

このソリューション は近いですが、問題はページ全体をjpegに変換しないことです。

50
vishvAs vAsuki

Pdf2imageライブラリを使用できます。

以下を使用して簡単にインストールできます。

pip install pdf2image

インストールしたら、次のコードを使用して画像を取得できます。

from pdf2image import convert_from_path
pages = convert_from_path('pdf_file', 500)

ページをjpeg形式で保存する

for page in pages:
    page.save('out.jpg', 'JPEG')

編集:Githubリポジトリ pdf2image は、pdftoppmを使用し、他のインストールが必要であることにも言及しています。

pdftoppmは、実際の魔法を行うソフトウェアです。 poppler と呼ばれるより優れたパッケージの一部として配布されます。 Windowsユーザーは、 poppler for Windows をインストールする必要があります。 Macユーザーは Mac用poppler をインストールする必要があります。 Linuxユーザーは、pdftoppmがディストリビューション(UbuntuおよびArchlinuxでテスト済み)でプリインストールされています。インストールされていない場合は、Sudo apt install poppler-utilsを実行します。

Windowsの適切なインストールを次に示します。 http://blog.alivate.com.au/poppler-windows/

72
Keval Dave

Pythonライブラリpdf2image(他の回答で使用)は実際にはしません 起動するだけではありませんpdttoppm with subprocess.Popen 、ここに直接それを行う短いバージョンがあります:

PDFTOPPMPATH = r"D:\Documents\software\____PORTABLE\poppler-0.51\bin\pdftoppm.exe"
PDFFILE = "SKM_28718052212190.pdf"

import subprocess
subprocess.Popen('"%s" -png "%s" out' % (PDFTOPPMPATH, PDFFILE)) #have updated the values here

pdftoppm(popplerという名前のパッケージに含まれる)のWindowsインストールリンクを次に示します。 http://blog.alivate.com.au/poppler-windows/

14
Basj

OSにPopplerをインストールする必要はありません。これは動作します:

pip install Wand

from wand.image import Image

with(Image(filename="somefile.pdf", resolution=120)) as source: 
    images = source.sequence
    pages = len(images)
    for i in range(pages):
        n = i + 1
        newfilename = f[:-4] + str(n) + '.jpeg'
        Image(images[i]).save(filename=newfilename)
5
DevB2F

@gaurwraith、Windows用popplerをインストールし、pdftoppm.exeを次のように使用します:

  1. http://blog.alivate.com.au/poppler-windows/ からPopplerの最新のバイナリ/ dllを含むZipファイルをダウンロードし、プログラムファイルフォルダーの新しいフォルダーに解凍します。例:「C:\ Program Files(x86)\ Poppler」。

  2. SYSTEM PATH環境変数に「C:\ Program Files(x86)\ Poppler\poppler-0.68.0\bin」を追加します。

  3. Cmd行からpdf2imageモジュールをインストール-> "pip install pdf2image"。

  4. または、ユーザーBasjの説明に従って、Pythonのサブプロセスモジュールを使用して、コードからpdftoppm.exeを直接実行します。

@vishvAs vAsuki、このコードは、指定されたフォルダー内の1つまたは複数のpdfのすべてのページのサブプロセスモジュールを介して、必要なjpgを生成する必要があります。

import os, subprocess

pdf_dir = r"C:\yourPDFfolder"
os.chdir(pdf_dir)

pdftoppm_path = r"C:\Program Files (x86)\Poppler\poppler-0.68.0\bin\pdftoppm.exe"

for pdf_file in os.listdir(pdf_dir):

    if pdf_file.endswith(".pdf"):

        subprocess.Popen('"%s" -jpeg %s out' % (pdftoppm_path, pdf_file))

または、pdf2imageモジュールを使用します。

import os
from pdf2image import convert_from_path

pdf_dir = r"C:\yourPDFfolder"
os.chdir(pdf_dir)

    for pdf_file in os.listdir(pdf_dir):

        if pdf_file.endswith(".pdf"):

            pages = convert_from_path(pdf_file, 300)
            pdf_file = pdf_file[:-4]

            for page in pages:

               page.save("%s-page%d.jpg" % (pdf_file,pages.index(page)), "JPEG")
3
photek1944

この簡単な解決策、PyMuPDF、pngファイルへの出力を見つけました

    import fitz
    pdffile = "infile.pdf"
    doc = fitz.open(pdffile)
    page = doc.loadPage(0) #number of page
    pix = page.getPixmap()
    output = "outfile.png"
    pix.writePNG(output)
2
JJPty

私はpdf2imageの(たぶん)もっとシンプルなオプションを使用します:

cd $dir
for f in *.pdf
do
  if [ -f "${f}" ]; then
    n=$(echo "$f" | cut -f1 -d'.')
    pdftoppm -scale-to 1440 -png $f $conv/$n
    rm $f
    mv  $conv/*.png $dir
  fi
done

これは、狭いキャストデバイスを使用するためのループ内のbashスクリプトの小さな部分です。追加されたpdfファイル(すべて)を5秒ごとにチェックして処理します。これはデモデバイス用で、最後に変換はリモートサーバーで行われます。現在、.PNGに変換していますが、.JPGも可能です。

この変換は、ビデオ、2つの滑らかなスクロールテキスト、ロゴ(3つのバージョンの移行あり)を表示するA4形式のトランジションとともに、Pi3をほぼ4x 100%cpu-loadに設定します;-)

0
Robert

彼らはpdfをjpgに変換するために使用できるpdftojpgと呼ばれるユーティリティです

ここでコードを見つけることができます https://github.com/pankajr141/pdf2jpg

from pdf2jpg import pdf2jpg
inputpath = r"D:\inputdir\pdf1.pdf"
outputpath = r"D:\outputdir"
# To convert single page
result = pdf2jpg.convert_pdf2jpg(inputpath, outputpath, pages="1")
print(result)

# To convert multiple pages
result = pdf2jpg.convert_pdf2jpg(inputpath, outputpath, pages="1,0,3")
print(result)

# to convert all pages
result = pdf2jpg.convert_pdf2jpg(inputpath, outputpath, pages="ALL")
print(result)
0
duck