コード集

このページにあるコードは私が普段、印刷物を少し編集するときに利用しているコードなどを置いています。 大抵のものはとても単純なものなので、webブラウザにそういう機能が備わっていたり、ちょっと性能の良いプリンターであれば印刷時の設定をいじればできてしまうものになっています。

このページの対象としてはpythonプログラミングをやったことがあって、ファイルのパスなどを適切に読み替えて利用できる人です。

PDFファイルの結合

pdfファイルを結合するためのプログラム


from pypdf import PdfWriter

# PdfMerger()オブジェクトを作成
merger = PdfWriter()

# 結合するPDFのパスをリストで準備
pdfs = ["path/to/file1","path/to/file2","path/to/file3"]

# for文で結合
for pdf in pdfs:
    merger.append(pdf)

# 書き出し
merger.write("output.pdf") # output.pdfとして書き出し。
merger.close()
        

PDFファイルの回転

pdfファイルのページを回転するためのプログラム


from pypdf import PdfReader, PdfWriter

# オブジェクトを作成
reader = PdfReader("path/to/file")
writer = PdfWriter()

# 各ページを回転させて追加
for page in reader.pages:
    page.rotate(90) #反時計回りに90度回転
    writer.add_page(page)

# 回転したものの出力
with open("output.pdf", "wb") as fp: # output.pdfとして書き出し。
    writer.write(fp)
        

PDFファイルのメタデータ削除

pdfファイルに埋め込まれているメタデータを消去するpythonコードです。


import pymupdf

# メタデータを削除したいpdfファイル(input.pdf)を読み込む。
doc = pymupdf.open("input.pdf")

# 削除したいメタデータの項目をTrueにする。
doc.scrub(
        metadata=True,
        xml_metadata=True,
        thumbnails=True,
        attached_files=True,
        hidden_text=True,
        embedded_files=True,
        reset_responses=True
)

# メタデータを削除後のデータをoutput.pdfに出力
doc.ez_save("output.pdf")
doc.close()
        

論文の冊子状印刷用

論文を小冊子状に印刷できるように順番を変更するPythonプログラムのソースコードです。 自分が利用しているプリンターに対応するためのアドホックなコードです。 印刷時のプリンターの設定等は後述します。 また、利用する際には、ソースコードと同じディレクトリにblank.pdfという白紙1ページのpdfファイルを用意してください。(Wordででも何で作っても良いです。)


from pypdf import PdfReader, PdfWriter

# オブジェクトを作成
reader = PdfReader("path/to/file") # 冊子状に印刷したい論文のpdfファイル
tmpWriter = PdfWriter()
booklet = PdfWriter()

# 全ページ数の取得
page_num = reader.get_num_pages()

# 論文をtmpWriterに格納
tmpWriter.append(reader,pages=(0,page_num))

# ページ数が4の倍数でなかったときは白紙ページを付加
if page_num%4!=0:
    for i in range(4-page_num%4):
        tmpWriter.append(PdfReader("blank.pdf"),pages=(0,1,1))
    page_num = page_num + 4 - page_num % 4

# ページ順序を変更して書き出し
for i in range(page_num//4):
    booklet.add_page(tmpWriter.pages[page_num-1 - 2*i])
    booklet.add_page(tmpWriter.pages[2*i])
    booklet.add_page(tmpWriter.pages[page_num-2 - 2*i].rotate(180))
    booklet.add_page(tmpWriter.pages[2*i + 1].rotate(180))

# 出力
with open("booklet.pdf", "wb") as fp: # booklet.pdfとして書き出す。
    booklet.write(fp)
        

出力されたbooklet.pdfをA3用紙で「横長、2ページ/1枚、両面印刷・短辺とじ」で印刷して半分に折れば、論文を冊子状にできます。

カラープロファイルの変更(RGB → CMYK)

RGBプロファイルのjpgファイルをCMYK(JapanColor2001Uncoated)プロファイルのjpgに変換するためのPythonコードです。(png形式はweb表示用でCMYKをサポートしていないらしい。) ポスターなどの印刷時にカラープロファイルをCMYKに変更しておくと、思っていた色と違うということがなくなると思います。

このコードを使うには、ICC profile downloads - Windowsから「ICC profile download for End Users」をダウンロードしておく必要があります。 Windows用みたいですが、Ubuntu 24.04では利用できました。 利用したいカラープロファイル(*.icc)を作業ディレクトリにコピーして利用してください。


from PIL import ImageCms, Image

def convert_to_cmyk():
        with Image.open("path/to/file") as img:
                # sRGBのプロファイル取得
                srgb = ImageCms.createProfile("sRGB")
                # sRGB → Japan Color 2001 Uncoated(CMYK)
                img = ImageCms.profileToProfile(img, srgb, "Adobe_ICC_Profiles_enduser/CMYK/JapanColor2001Uncoated.icc",renderingIntent=ImageCms.Intent(1),outputMode="CMYK")
                # ICCプロファイルを埋め込んで保存
                with open("Adobe_ICC_Profiles_enduser/CMYK/JapanColor2001Uncoated.icc", "rb") as fp: 
                        profile = fp.read()
                img.save("path/to/file",icc_profile=profile)
if __name__ == "__main__":
        convert_to_cmyk()
        

以下のサイトを参考にしました。

参照したサイト

Prism.js
このページでのシンタックスハイライトのためにPrism.jsを利用しています。
Blogger.comにPrism.jsをCDNで導入する-p--q
CDNでPrism.jsを利用する方法について参考にしました。
prismjs CDN by jsDelivr - A CDN for npm and GitHub
CDNにはこちらのjsDeliverを利用しました。