Pythonで利用できるPDF操作ライブラリ[ReportLab]で画像をPDFファイルに挿入する場合に背景透過を設定したPNG画像を利用する場合の手順を備忘録的に投稿します。
drawInlineImageでは透過しない
[canvas]オブジェクトにある[drawInlineImage]メソッドを利用して画像ファイルを挿入する場合、透過色が設定されているPNG画像を選択しても作成後のPDFファイル内では下のイメージのように透過色は白色で表示される場合があります。
drawInlineImageのプロトタイプを確認しても、それらしいオプションはありません。
def drawInlineImage(image, x, y, width=None, height=None, preserveAspectRatio=False, anchor='c', anchorAtXY=False, showBoundary=False)
背景透過でPNG画像を挿入する手順
透過色が設定されているPNGファイルを透過でPDFファイルに挿入するには[drawInlineImage]ではなく[drawImage]メソッドの[mask]オプションを利用します。
実際にVSCodeで挿入する手順は次のように行います。
1. 透過色が設定されている画像と挿入するPDFファイルを用意します。PDFファイルに画像ファイルを挿入する方法は別記事をご覧ください。
2. 新しく[insertpdf.py]ファイルを追加して、次のコードを追加します。
from pdfrw import PdfReader
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl
from reportlab.pdfgen import canvas
from PIL import Image
import io
from reportlab.lib.utils import ImageReader
#保存するPDFファイル
cvs = canvas.Canvas('C:\Datas\Python\imginpdf\output\sample.pdf')
#挿入するPDFファイル
pdf = PdfReader('C:\Datas\Python\imginpdf\pdfs\見積書.pdf', decompress=False).pages
page = pagexobj(pdf[0])
cvs.doForm(makerl(cvs, page))
#透過PNGファイル
img = ImageReader('C:\\Datas\\Python\\imginpdf\\images\\target_image.png')
#PNGファイルをPDFに挿入
cvs.drawImage(img, 450, 640, 70, 70, preserveAspectRatio=True, mask='auto')
cvs.showPage()
cvs.save()
3. コードで指定した場所にPDFファイルと画像ファイルを配置します。
4. [ターミナル]画面に次のコマンドを入力します。
python insertpdf.py
5. 保存したPDFファイルを表示して画像を確認します。
expected … not PngImageFile エラーの対処法
実行時に「TypeError: expected str, bytes or os.PathLike object, not PngImageFile」エラーが表示される場合があります。
エラー内容からパラメータで利用する画像ファイルのオブジェクトがパス指定だと駄目ですと通知されています。
drawImageメソッドで利用するImageパラメータを、下のコードのように[open]メソッドなどで作成する場合にエラーになるので
img = Image.open('C:\\Datas\\Python\\imginpdf\\images\\target_image.png')
ReportLabの[ImageReader]を利用してImageオブジェクトを作成するとエラーを改善することができます。
from reportlab.lib.utils import ImageReader
img = ImageReader('C:\\Datas\\Python\\imginpdf\\images\\target_image.png')
まとめ
Pythonで利用できる[ReportLab]ライブラリを利用して透過色を設定したPNG画像をPDFファイルに挿入することができます。
挿入した画像が透過しない場合には[drawImage]メソッドを利用して必ず[mask]オプションを有効にする必要があります。
また、同じようにPDFファイルに画像を挿入できる[drawInlineImage]メソッドには[mask]オプションが無いので注意が必要です。
スポンサーリンク
最後までご覧いただき、ありがとうございます。