関連: PDFからのテキスト抽出

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")
- 出力の例
    - ![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

    • $ 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
    • imageimage
    • 酷いジャギジャギ
  • 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
    • imageimage
    • だいぶマシ
  • 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
    • imageimage
    • 題字の雰囲気がだいぶ変わった?(細くなった?シャープになった印象)
    • 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
    • imageimage
    • 汚い
    • 明朝体の「変」の横画などが消えている
    • 拡大(左:gs、右: pdftoppm)
    • image
    • 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"
    • imageimage
    • コマンドラインの出力からわかるように、内部的には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が紙の書籍の裁断スキャンであるので、スキャン結果が画像ファイルで入っている
    • image
    • 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
    • imageimage
    • きれいではあるが、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
    • imageimage
    • 拡大(左上gs、右上pdftoppm、左下pdfimagesして縮小、右下pdftocairo)
      • image
      • pdfimagesから縮小したものとほぼ同等の出力
      • イコールではないが、1ライン切りだして、並べてじっくり見たら差がわかる、ぐらいの僅差
    • 10ページで34秒掛かっており、割と遅い(pdftoppmで270ページ出すのに19秒なので、ざっくり48倍遅い)

2017-08-23