こしあん
2022-09-30

img2pdfを使ってPDFにカラープロファイルを確実に埋め込む


1.1k{icon} {views}


画像のカラープロファイルは印刷の際に重要なことが多いですが、img2pdfを使ってPDFにICCプロファイルを確実に埋め込む方法を見ていきます。入稿データにPDFが指定されている場合に使えるテクニックです。

背景

入稿用に作った、RGB→CMYK変換済のPDFに、カラープロファイルが埋め込まれていなかったのか、表示がおかしい(くすむ)現象が発生したので、メモがてらに書いておきます。

方針としては、

  • PILで作った画像を、オンメモリでいったん画像として書き出す。このとき画像にICCプロファイルを付与する
  • オンメモリの画像をimg2pdfでPDFに変換する

このやり方ですと、例えばtiffのような形式で保存して、カラープロファイルを埋め込んで入稿すればいいのですが、印刷所によってはPDFが指定されているケースがあるので、このやり方が必要になる場合があります。

img2pdf

https://pypi.org/project/img2pdf/

インストールは

pip install img2pdf

コード

ICCプロファイルはAdobeのページからダウンロードします。

import img2pdf
from PIL import Image, ImageDraw
import io

def main():
    # CMYK : Background = white
    with Image.new("CMYK", (1920, 1080), color=(0,0,0,0)) as canvas:
        draw = ImageDraw.Draw(canvas)
        draw.rectangle((100, 100, 500, 500), fill=(255, 0, 0, 0)) # Cyan
        draw.rectangle((900, 200, 1300, 600), fill=(0, 255, 0, 0)) # Magenta
        draw.rectangle((1400, 600, 1800, 1000), fill=(0, 0, 255, 0)) # Yellow
        draw.rectangle((400, 600, 800, 1000), fill=(0, 0, 0, 255)) # Black

    # ICC Profile
    with open("JapanColor2001Coated.icc", "rb") as fp:
        profile_cmyk = fp.read()

    # 画像の書き出し → PDFの書き出し
    with io.BytesIO() as buf:
        canvas.save(buf, icc_profile=profile_cmyk, dpi=(72, 72), format="tiff")
        buf.seek(0)
        with open("output.pdf", "wb") as fp:
            fp.write(img2pdf.convert(buf))


if __name__ == "__main__":
    main()

Acrobat Readerで確認すると

PDFのスクショです。画像ではわかりづらいですが、くすんでいない画像になります。

72dpiで指定したので、ページサイズもそれに見合う形になっています。理論値は以下の通りで、

  • 1920px / 72dpi × 25.4mm/inch = 673.33mm
  • 1080px / 72dpi × 25.44mm/inch = 381.00mm

実際に確認すると理論値通りのサイズになっています。

Photoshopで確認すると

ICCプロファイルの埋め込みを確認しましょう。

(Photoshopで開くとだいたいうまくいくことが多いのですが)、「ソースカラープロファイル」が「Japan Color 2001 Coated」になっており、PDFにカラープロファイルが埋め込まれていることが確認できます。



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

技術書コーナー

北海道の駅巡りコーナー


Add a Comment

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