generated at
PDFからPNGへの変換

2023-04-07
前にまとめてから5年も経ってるのでGPT4にオススメを聞いてみた
裁断スキャンPDFに対するGPT4の答え: PyPDF2
これはPDFによっては KeyError: '/XObject' になる
下記2017年のまとめのように画像埋め込みがされてないとエラーになるのだろう
一般の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")
出力の例
デフォルトだと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
$ 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