LoginSignup
12
12

More than 1 year has passed since last update.

PythonでPDFに文字や画像を記入

Last updated at Posted at 2021-12-14

トラストバンクといったら「ふるさとチョイス」が代名詞ではあるのですが、「ふるさとチョイス」以外にもいくつか事業を展開しております。
その1つに自治体専用ツール(LoGoチャット、LoGoフォーム)の開発・提供をしている事業部があります。

自治体専用ビジネスチャットツール「LoGoチャット」
https://publitech.fun/service_logochat
自治体専用WEBフォーム作成ツール「LoGoフォーム」
https://publitech.fun/service_logoform

今回は、このLoGoフォームで使われている「PDF作成機能」についてご紹介させていただきます

準備

とりあえず試したい方向けのDockerfile。これでPythonの環境ができあがり

FROM python:3.8.12-bullseye

RUN pip install --upgrade pip
RUN pip install --upgrade setuptools

RUN pip install -y pdfrw reportlab

WORKDIR /opt

PDFに文字を書き出す

文字の書き出し

元のPDFファイルとなる「sample.pdf(A4縦)」を用意してください

from pdfrw import PdfReader
from pdfrw.buildxobj import pagexobj
from pdfrw.toreportlab import makerl
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import portrait, landscape, A3, A4, A5, A6, B3, B4, B5, B6

def make_pdf():
    file_in  = './sample.pdf'
    file_out = './sample_out.pdf'

    # 元のPDFを読み込み
    pages = PdfReader(file_in, decompress=False).pages

    # キャンバスのセット
    cc = canvas.Canvas(file_out, pagesize=portrait(A4))

    # ページ取得
    pp = pagexobj(pages[0])
    cc.doForm(makerl(cc, pp))

    # 文字書き出し
    cc.drawString(x=20, y=10, text='aaa')

    cc.showPage()
    cc.save()

これでPDFに文字が書き足されます!(左下にコッソリとw)
というのもこの「pdfrw」を使ったときの起点は 左下 になります
ですので表示したい位置を左下から計る必要があります

image.png image.png

pdfrw で書き出すときの起点は左下

指定位置への書き出し

書き出せたところで次は指定の位置に書き出してみたい
適当にx,yの引数を試して目的の場所に当たりをつけていくのでもいいですが、おおまかな位置だけでも測ってから微調整としたいところ

位置の測り方

今回は無料のAcrobat Reader DC でのやり方

ツールの物差しを使って、
image.png

左下からの大まかな位置を確認します
image.png

指定位置への書き出し

さきほどのソースの書き出し部分をこちらに変更

from reportlab.lib.units import mm

cc.drawString(x=19.97*mm, y=21.55*mm, text='aaa')

drawString のx,yはpxでの指定になるため「ものさし」で出てくるmmでは単位があわない
そんなときは、reportlab に用意されている mm を使用
上記のように ミリメートルの値に mm を乗算することでの指定が可能になる
出力結果はこちら

image.png

drawString の引数(位置指定)は px(ピクセル)

指定の位置に文字が書けたらあとはこんなこともできるよという紹介を

文字の中央揃え、右揃え

中央揃え、右揃えで書き出すことが可能です

# 通常の左揃え(指定した位置から右に文字が記載される)
cc.drawString(x=40.00*mm, y=24.55*mm, text='aaa')
# 中央揃え(指定した位置を中心に左右に文字が記載される)
cc.drawCentredString(x=40.00*mm, y=24.55*mm, text='bbb')
# 右揃え(指定した位置から左に文字が記載される)
cc.drawRightString(x=40.00*mm, y=24.55*mm, text='ccc')

同じ引数でもそれぞれこんな出力になる
image.png
image.png
image.png

文字の色を変える

出力する文字の色をかえることも可能です

from reportlab.lib.colors import HexColor

cc.setFillColor(HexColor('#FF0000')) # RRGGBB で指定
cc.drawString(x=40.00*mm, y=24.55*mm, text='aaa')

image.png

PDFに画像を出力

画像の書き出しも可能で、このように書きます

image_path = './logo.png'
cc.drawImage(image=image_path, x=23.00*mm, y=245.00*mm, width=50*mm, height=50*mm, mask='auto')

image.png

ぜひいろいろと試してみてください

12
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12