背景
あるデモプログラムにて、PDF を page 分割処理にて、pypdf が使われていたが、
何故か分割したファイルのサイズが、分割前と変わっていなかったので、調査した記録
結論
- add_page() は、コンテンツ保持したまま、page を追加するのでファイルサイズは元ファイルとほぼ変わらない
- append() は、対象ページだけの追加になるので、ページ分割すればちゃんと小さくなる。
ということで、append() を使おうってだけ
- PdfMerger はすでに deprecated なので、PdfWriter を使おう
-
pypdf history で、最新版を確認しよう。今は、pypdf が最新
- The Origins: pyPdf (2005-2010)
- PyPDF2 is born (2011-2016)
- PyPDF3 and PyPDF4 (2018 - 2022)
- PyPDF2: Reborn (2022)
- pypdf: Back to the Roots (2023-Today)
調査記録
元々は、分割したファイルサイズを小さくする方法を探していた。
- で、以下のページを試したが、ページ単位で保存する場合、何をやってもファイルサイズ変わらず。
で、最後の以下記述で、あ、なるほど、と理解した感じ
When a page is removed from the page list, its content will still be present in the PDF file. This means that the data may still be used elsewhere.
Simply removing a page from the page list will reduce the page count but not the file size. In order to exclude the content completely, the pages should not be added to the PDF using the PdfWriter.append() function. Instead, only the desired pages should be selected for inclusion (note: PR #1843 will add a page deletion feature).
で、実際の比較時のコード
- 以下で 40 ページだけを取得してみたところ、無事 append() ならサイズが小さくなりました。
from pypdf import PdfReader, PdfWriter #, PdfMerger is deprecated and will be removed in pypdf 5.0.0. Use PdfWriter instead.
reader = PdfReader(inputFilePath)
writer = PdfWriter()
writer.append(reader, pages=(40,41))
writer.write("outputs/append.pdf") # 小さくなる
writer_as_add_pages = PdfWriter()
writer_as_add_pages.add_page(reader.pages[40])
writer_as_add_pages.write("outputs/add_page.pdf") # 小さくはならない
あとがき
このサンプル用で使われてる処理だったんだけど、元となる英語版ではすでに Document Intelligence Service に舵を切ってることに気付いたので、この対策自体不要になるんですけどね