LoginSignup
7
12

More than 5 years have passed since last update.

PythonでPDFフォームにデータを埋める

Posted at

PDFフォームにデータを挿入したい。
以下の環境で試してきた。

  • Java
    • iText
  • PowerShell
    • iTextSharp

Pythonでできないかを探していた。
やっと見つけた。

How to Populate Fillable PDF's with Python

英語読めてPythonお得意なら上記のサイトを見てやるといいよ。

環境

僕の環境は下記の通り
多分、LinuxやmacOSの方が快適に動くと思う。

  • Windows10 Pro x64
  • Python 3.5.5
  • pdfrw

pdfrwはPythonのLibrary
下記のようにpipを使ってインストールしておくといいでしょう。

# pdfrwをインストールしておく
C:\> python -m pip install pdfrw

サンプルコード

コードに書くとこんな感じです。

fillform.py
#! /usr/bin/python

import os
import pdfrw

INVOICE_TEMPLATE_PATH = 'pdfform.pdf'
INVOICE_OUTPUT_PATH = 'fillform.pdf'

ANNOT_KEY = '/Annots'
ANNOT_FIELD_KEY = '/T'
ANNOT_VAL_KEY='/V'
ANNOT_RECT_KEY = '/Rect'
SUBTYPE_KEY = '/Subtype'
WIDGET_SUBTYPE_kEY='/Widget'

def write_fillable_pdf(input_pdf_path,output_pdf_path,data_dict):
    template_pdf=pdfrw.PdfReader(input_pdf_path)
    annotations=template_pdf.pages[0][ANNOT_KEY]
    for annotation in annotations:
        if annotation[SUBTYPE_KEY]==WIDGET_SUBTYPE_kEY:
            key=annotation[ANNOT_FIELD_KEY][1:-1]
            if key in data_dict.keys():
                annotation.update(
                    pdfrw.PdfDict(V='{}'.format(data_dict[key]))
                )

    pdfrw.PdfWriter().write(output_pdf_path,template_pdf)


data_dict={
    'name':'齋藤さん',
    'gender':'男'
}

if __name__ == '__main__':
    write_fillable_pdf(INVOICE_TEMPLATE_PATH,INVOICE_OUTPUT_PATH,data_dict)

GitHubに上げておきました。
https://github.com/arachan/pdffillformpy

問題

僕の作ったPDFでは問題はない。
invoice_templateの方はTextBoxNameが邪魔してFormに挿入したデータが見えない。
印刷してもTextBoxの名前だけが印刷されてしまう。
PDFの仕様とpdfrwの問題なのだとは思うが、きっちり調査できてない。

Reference

How to Populate Fillable PDF's with Python

7
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
7
12