Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

arachan@github
情報システムという名の雑用係 社内のパソコンをADなしで集中管理したいために PowerShellを少し嗜む。 プログラムよりもUBCD使ってPCを修理するのが得意な逸般人 最近、Win7マシンに軒並み入れ替わったので、 修理マシンがなく、プログラムに精を出し始めたが、 大して何も作れてないマン。 Excel方眼紙とネ申FileMakerが大っ嫌い。
http://arachansan.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away