img2pdfを使ってPDFにカラープロファイルを確実に埋め込む
Posted On 2022-09-30
画像のカラープロファイルは印刷の際に重要なことが多いですが、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の中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー
北海道の駅巡りコーナー