こしあん
2020-12-12

PythonでPDFをトリミングする方法

Pocket
LINEで送る
Delicious にシェア

243{icon} {views}



印刷用の原稿では「塗り足し」に気をつける必要があります。印刷用と表示用でページサイズが変わり、表示用のPDFを作るのに印刷用のPDFをトリミングする必要が出てきます。この変換をPythonで一括でやってみます。

PDFのサイズについて

PDFのサイズはAcrobat Readerを使うと確認できます。今「cat.pdf」というPDFがあったとしましょう。

ページサイズというのがポイントです。このPDFは216×303mmあります。塗り足しの関係で上下左右+3mmされています。これを表示用にA4サイズ「210×297mm」にトリミングしたいとします。これをPythonでやっていきます。

PyPDF2のページサイズ

事前にPyPDF2をインストールしておきましょう。

pip install PyPDF2

PDFのページは内部的にはMediaBoxで扱われています。これの四辺の座標を取得することでページサイズを計算することができます。PyPDF2では以下のようにします。

PDFのページごとにMediaBoxのオブジェクトを持っています。ページ単位でMediaBoxを独立して管理しています。各ページのページサイズを確認するには、

from PyPDF2 import PdfFileReader, PdfFileWriter

def crop_pdf():
    # 用紙を確認
    input_pdf = PdfFileReader("cat.pdf")
    # 1ページしかないのでループは1回
    for i in range(input_pdf.getNumPages()):
        page = input_pdf.getPage(i)
        # Media Boxの座標=サイズ(pt単位)
        lower_left = page.mediaBox.getLowerLeft()
        upper_right = page.mediaBox.getUpperRight()
        print(lower_left)
        print(upper_right)

if __name__ == "__main__":
    crop_pdf()

次のような出力になります。

(0, 0)
(612.36, 858.96)

単位はポイントpt)です。フォントサイズと同じ単位です。ここがミソです。

MediaBoxは長方形ですが、左下を原点とし、右上方向に座標を進めていきます。つまり、右上の座標をmmに変換すればAcrobat Readerで表示されている値と一致するはずです。なお、各Tupleは(横のpt、縦のpt)という構造です。

ptとmmの関係

PDFを正確にトリミングするには、フォントサイズのポイントの関係を知る必要があります。そもそもDTPにおけるポイント(pt)の定義は、1インチ=25.4mm=72ptです。ポイントは他にも定義がありますが、PDFはこの式で計算すると経験上正しく出ます。

先程のMediaBoxの右上の座標をmmに変換してみます。

  • 横:612.36÷72×25.4 = 216.027mm
  • 縦:858.96÷72×25.4 = 303.022mm

となり端数はありますが、216mm×303mmとAcrobat Readerの表示値と一致しました。端数はPDFを生成する過程で出たものと思われます。

CropBoxでトリミング

PDFをトリミングして表示したい場合は、PDFのCropBoxを使います。デフォルトでは、CropBoxとMediaBoxは同じ領域ですが、CropBoxを独立して指定するとトリミングすることができます。

上下左右3mmトリミングするのなら、CropBoxの座標指定は、「左下が(3mm, 3mm)、右上が(トリミング前の幅-3mm, トリミング前の高さ-3mm)」となります。ただし、これはMediaBox同様pt単位で指定する必要があります。これをコードで書くと次のようになります。

from PyPDF2 import PdfFileReader, PdfFileWriter

def crop_pdf():
    # PDFをトリミングして保存
    input_pdf = PdfFileReader("cat.pdf")
    out_pdf = PdfFileWriter()

    # 1インチ=25.4mm=72pt
    pt_per_mm = 72 / 25.4

    # 1ページしかないのでループは1回
    for i in range(input_pdf.getNumPages()):
        page = input_pdf.getPage(i)
        # Media Boxの座標=サイズ(pt単位)
        lower_left = page.mediaBox.getLowerLeft()
        upper_right = page.mediaBox.getUpperRight()
        # 上下左右3mmトリミング
        page.cropBox.lowerLeft = (3*pt_per_mm, 3*pt_per_mm)
        # 右上は(213*pt_per_mm, 300*pt_per_mm)と絶対指定してもよい
        page.cropBox.upperRight = (float(upper_right[0])-3*pt_per_mm, float(upper_right[1])-3*pt_per_mm)

        # 書き出しPDFに追加
        out_pdf.addPage(page)

    with open("cat_trim.pdf", "wb") as fp:
        out_pdf.write(fp)

if __name__ == "__main__":
    crop_pdf()

出力されたcat_trim.pdfをAcrobat Readerで確認してみましょう。

この通り上下左右3mmずつトリミングされてA4サイズにすることができました!

関連:https://stackoverflow.com/questions/457207/cropping-pages-of-a-pdf-file



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

【新刊】インフィニティNumPy――配列の初期化から、ゲームの戦闘、静止画や動画作成までの221問

「本当の実装力を身につける」ための221本ノック――
機械学習(ML)で避けて通れない数値計算ライブラリ・NumPyを、自在に活用できるようになろう。「できる」ための体系的な理解を目指します。基礎から丁寧に解説し、ディープラーニング(DL)の難しいモデルで遭遇する、NumPyの黒魔術もカバー。初心者から経験者・上級者まで楽しめる一冊です。問題を解き終わったとき、MLやDLなどの発展分野にスムーズに入っていけるでしょう。

本書の大きな特徴として、Pythonの本でありがちな「NumPyとML・DLの結合を外した」点があります。NumPyを理解するのに、MLまで理解するのは負担が大きいです。本書ではあえてこれらの内容を書いていません。行列やテンソルの理解に役立つ「従来の画像処理」をNumPyベースで深く解説・実装していきます。

しかし、問題の多くは、DLの実装で頻出の関数・処理を重点的に取り上げています。経験者なら思わず「あー」となるでしょう。関数丸暗記では自分で実装できません。「覚える関数は最小限、できる内容は無限大」の世界をぜひ体験してみてください。画像編集ソフトの処理をNumPyベースで実装する楽しさがわかるでしょう。※紙の本は電子版の特典つき

モザイク除去から学ぶ 最先端のディープラーニング

「誰もが夢見るモザイク除去」を起点として、機械学習・ディープラーニングの基本をはじめ、GAN(敵対的生成ネットワーク)の基本や発展型、ICCV, CVPR, ECCVといった国際学会の最新論文をカバーしていく本です。
ディープラーニングの研究は発展が目覚ましく、特にGANの発展型は市販の本でほとんどカバーされていない内容です。英語の原著論文を著者がコードに落とし込み、実装を踏まえながら丁寧に解説していきます。
また、本コードは全てTensorFlow2.0(Keras)に対応し、Googleの開発した新しい機械学習向け計算デバイス・TPU(Tensor Processing Unit)をフル活用しています。Google Colaboratoryを用いた環境構築不要の演習問題もあるため、読者自ら手を動かしながら理解を深めていくことができます。

AI、機械学習、ディープラーニングの最新事情、奥深いGANの世界を知りたい方にとってぜひ手にとっていただきたい一冊となっています。持ち運びに便利な電子書籍のDLコードが付属しています。

「おもしろ同人誌バザールオンライン」で紹介されました!(14:03~) https://youtu.be/gaXkTj7T79Y?t=843

まとめURL:https://github.com/koshian2/MosaicDeeplearningBook
A4 全195ページ、カラー12ページ / 2020年3月発行

Shikoan's ML Blog -Vol.1/2-

累計100万PV超の人気ブログが待望の電子化! このブログが電子書籍になって読みやすくなりました!

・1章完結のオムニバス形式
・機械学習の基本からマニアックなネタまで
・どこから読んでもOK
・何巻から読んでもOK

・短いものは2ページ、長いものは20ページ超のものも…
・通勤・通学の短い時間でもすぐ読める!
・読むのに便利な「しおり」機能つき

・全巻はA5サイズでたっぷりの「200ページオーバー」
・1冊にたっぷり30本収録。1本あたり18.3円の圧倒的コストパフォーマンス!
・文庫本感覚でお楽しみください

Vol.1 電子550円
Vol.2 電子550円

北海道の駅巡りコーナー

日高本線 車なし全駅巡り

ローカル線や秘境駅、マニアックな駅に興味のある方におすすめ! 2021年に大半区間が廃線になる、北海道の日高本線の全区間・全29駅(苫小牧~様似)を記録した本です。マイカーを使わずに、公共交通機関(バス)と徒歩のみで全駅訪問を行いました。日高本線が延伸する計画のあった、襟裳岬まで様似から足を伸ばしています。代行バスと路線バスの織り成す極限の時刻表ゲームと、絶海の太平洋と馬に囲まれた日高路、日高の隠れたグルメを是非たっぷり堪能してください。A4・フルカラー・192ページのたっぷりのボリュームで、あなたも旅行気分を漫喫できること待ったなし!

見どころ:日高本線被災区間(大狩部、慶能舞川橋梁、清畠~豊郷) / 牧場に囲まれた絵笛駅 / 窓口のあっただるま駅・荻伏駅 / 汐見の戦争遺跡のトーチカ / 新冠温泉、三石温泉 / 襟裳岬

A4 全192ページフルカラー / 2020年11月発行


Pocket
LINEで送る
Delicious にシェア

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です