関連: PDFからのテキスト抽出
2023-04-07
- 前にまとめてから5年も経ってるのでGPT4にオススメを聞いてみた
- 裁断スキャンPDFに対するGPT4の答え: PyPDF2
- これはPDFによっては
KeyError: '/XObject'
になる - 下記2017年のまとめのように画像埋め込みがされてないとエラーになるのだろう
- これはPDFによっては
- 一般のPDFについてのGPT4の答え: pdf2image
$ pip install pdf2image
- これは内部的にはpdftocairoを使う、pdftocairoはpopplerのツール
$ brew install poppler
python
from pdf2image import convert_from_path
images = convert_from_path(pdf_path)
for i, image in enumerate(tqdm(images)):
image.save(os.path.join(output_dir, f"{i+1}.png"), "PNG")
- 出力の例
- ![image](https://gyazo.com/e475b087b9ff628e9d78baa62758e604/thumb/1000)
- デフォルトだと72dpi
2017-08-23
-
まとめ
- gsは画質が酷い、ImageMagick(convert)も内部でgsを使う。pdftoppmはマシだが、pdftocairoが一番良い。
pdftocairo -r 200 -f 0 -png mybook.pdf prefix
- 裁断スキャンPDFに関してはpdfimagesで埋め込まれている-r 300相当の画像を取り出すのが最も綺麗
- そういうPDFかどうかの判断が必要なのが問題。
- pdftocairoはpdfimagesとほぼ変わりない品質。ただし48倍遅い
- gsは画質が酷い、ImageMagick(convert)も内部でgsを使う。pdftoppmはマシだが、pdftocairoが一番良い。
-
gs
$ time gs -q -dBATCH -dNOPAUSE -sDEVICE=png16m -r100 -sOutputFile=pages_%04d.png mybook.pdf
gs -q -dBATCH -dNOPAUSE -sDEVICE=png16m -r100 -sOutputFile=pages_%04d.png 219.36s user 5.22s system 95% cpu 3:54.68 total
- 552x823
- 酷いジャギジャギ
-
pdftoppm
$ time pdftoppm -r 100 -png mybook.pdf mybook
pdftoppm -r 100 -png mybook.pdf mybook 464.95s user 6.77s system 96% cpu 8:07.62 total
- 552x823
- だいぶマシ
-
pdftoppm 2倍の解像度で出力
$ time pdftoppm -r 200 -png mybook.pdf mybook
pdftoppm -r 200 -png mybook.pdf mybook 1104.28s user 12.22s system 96% cpu 19:14.59 total
- 1104x1646
- 題字の雰囲気がだいぶ変わった?(細くなった?シャープになった印象)
- 2倍のサイズで出した後上記サムネイルでは2倍に縮小される。その過程で文字が細くなる?
-
ではgsで2倍の解像度で出したらどうなるか
$ time gs -q -dBATCH -dNOPAUSE -sDEVICE=png16m -r200 -sOutputFile=pages_%04d.png mybook.pdf
gs -q -dBATCH -dNOPAUSE -sDEVICE=png16m -r200 -sOutputFile=pages_%04d.png 619.65s user 13.83s system 93% cpu 11:14.36 total
- 汚い
- 明朝体の「変」の横画などが消えている
- 拡大(左:gs、右: pdftoppm)
- gsは1ピクセル1回しかサンプリングしてなさげ。pdftoppmは何回かサンプリングして混ぜ合わせている挙動にみえる。
-
ImageMagick(convert)
$ time convert -verbose -density 200 mybook.pdf pages_%04d.png
"gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r200x200" "-sOutputFile=/tmp/magick-le3ab9PT-%08d" "-f/tmp/magick-s7CciX7v" "-f/tmp/magick-6huEpaq8"
- コマンドラインの出力からわかるように、内部的にはgsを叩いている。画質もgs同様。
-
pdfimages
$ time pdfimages -j mybook.pdf ./pages
pdfimages -j mybook.pdf ./pages 6.14s user 2.51s system 59% cpu 14.569 total
- 対象PDFの中の画像ファイルを取り出す
- 実験対象PDFが紙の書籍の裁断スキャンであるので、スキャン結果が画像ファイルで入っている
- 1656x2469
- gsやpdftoppmの-rオプションが100の時552x823だったので、-r 300 相当。
- 同一解像度に縮小してみる
$ convert -thumbnail 1104x1646 ex7/pages-002.jpg t.png
convert -thumbnail 1104x1646 ex7/pages-002.jpg t.png 3.86s user 0.09s system 98% cpu 4.002 total
- きれいではあるが、PDFの出自を選ぶ
-
pdftocairo
$ time pdftocairo -r 200 -f 0 -l 10 -png mybook.pdf pages
pdftocairo -r 200 -f 0 -l 10 -png mybook.pdf pages 27.02s user 0.29s system 79% cpu 34.260 total
- 拡大(左上gs、右上pdftoppm、左下pdfimagesして縮小、右下pdftocairo)
- pdfimagesから縮小したものとほぼ同等の出力
- イコールではないが、1ライン切りだして、並べてじっくり見たら差がわかる、ぐらいの僅差
- 10ページで34秒掛かっており、割と遅い(pdftoppmで270ページ出すのに19秒なので、ざっくり48倍遅い)
2017-08-23