17

何度も入力する必要がある PDF フォームがあります (正確にはタイムシートです)。これを手作業で行いたくないので、Pythonスクリプトまたはbashスクリプトで使用できるツールを使用してそれらに記入する方法を探していました。

誰もこれを経験していますか?

4

4 に答える 4

17

Python の場合、fdfgen lib と pdftk が必要です。

@Hugh Bothwellのコメントは100%正しいので、その答えを実際の実装で拡張します。

Windows を使用している場合は、python と pdftk の両方がシステム パスに含まれていることも確認する必要があります (長いフォルダー名を使用する場合を除きます)。

CSV データ ファイルから PDF フォームのコレクションを自動バッチ入力するコードは次のとおりです。

import csv
from fdfgen import forge_fdf
import os
import sys

sys.path.insert(0, os.getcwd())
filename_prefix = "NVC"
csv_file = "NVC.csv"
pdf_file = "NVC.pdf"
tmp_file = "tmp.fdf"
output_folder = './output/'

def process_csv(file):
    headers = []
    data =  []
    csv_data = csv.reader(open(file))
    for i, row in enumerate(csv_data):
      if i == 0:
        headers = row
        continue;
      field = []
      for i in range(len(headers)):
        field.append((headers[i], row[i]))
      data.append(field)
    return data

def form_fill(fields):
  fdf = forge_fdf("",fields,[],[],[])
  fdf_file = open(tmp_file,"w")
  fdf_file.write(fdf)
  fdf_file.close()
  output_file = '{0}{1} {2}.pdf'.format(output_folder, filename_prefix, fields[1][1])
  cmd = 'pdftk "{0}" fill_form "{1}" output "{2}" dont_ask'.format(pdf_file, tmp_file, output_file)
  os.system(cmd)
  os.remove(tmp_file)

data = process_csv(csv_file)
print('Generating Forms:')
print('-----------------------')
for i in data:
  if i[0][1] == 'Yes':
    continue
  print('{0} {1} created...'.format(filename_prefix, i[1][1]))
  form_fill(i)

注: これをカスタマイズする方法を理解するのにロケット手術をする必要はありません。初期変数宣言には、カスタム構成が含まれています。

CSV では、最初の行の各列に、PDF ファイル内の対応するフィールド名が含まれます。テンプレートに対応するフィールドがない列は無視されます。

PDF テンプレートで、データを入力する編集可能なフィールドを作成し、名前が CSV データと一致することを確認します。

この特定の構成では、このファイルを NVC.csv、NVC.pdf、および「output」という名前のフォルダーと同じフォルダーに配置するだけです。それを実行すると、残りは自動的に行われます。

于 2013-01-10T02:37:32.613 に答える