web-dev-qa-db-ja.com

PDFの上に差し込み印刷を行う方法は?

何千人もの人々に送信されることになっている私たちのデザイナー(Adobe InDesignに組み込まれている)からPDF.

私はすべての人のリストを持っており、OpenOffice.orgで差し込み印刷を行うのは簡単です。ただし、OpenOffice.orgは高度なPDFをサポートしていません。各ページにテキストを出力して印刷したいだけです。

私の今のやり方は次のとおりです。PDFの6.000部を印刷してから、それらすべてを再度プリンターに入れ、名前、住所、その他の情報をその上に印刷するだけです。しかし、それは高価です。

残念ながら、PDFを画像にして、OpenOffice.orgで使用することはできません。これは、コンピューターが停止するためです。また、このジョブをプリンターに送信するのに非常に長い時間がかかります。 。

それで、サードパーティのクローズドソリューションにお金を払わずにこの差し込み印刷を(できればPythonで)行う簡単な方法はありますか?

13
Velmont

今、私はアカウントを作成しました。独創的なpdftkを使って修正しました。

私の探求では、機能「背景」と「オーバーレイ」を完全に見落としています。私の解決策はこれでした:

pdftk names.pdf background boat_background.pdf output out.pdf

Python reportlabまたは同様のPDF作成スクリプトを使用して簡単に実行できるnames.pdfの作成。これを行うにはコードを使用するのが最適です。LibreOffice/ OpenOfficeでは6kページの作成に数時間かかりました。 Pythonを使用すると数秒しかかかりませんでした。

7

2つのはるかに簡単で安価なソリューションがあります。

まず、DataMergeを使用してInDesignで直接差し込み印刷を行うことができます。これは、CSでInDesignに追加されたユーティリティです。名前をCSV形式でエクスポートまたは保存します。データをInDesignテンプレートにインポートしてから、名前、住所などのフィールドをレイアウトにドロップします。 Goを押します。完成したすべての文字を含む新しいドキュメントが作成されます。または、プリンタに直接アクセスすることもできます。

または、データをXMLファイルにエクスポートし、InDesignのXMLプレースホルダーを使用して動的レイアウトを作成することもできます。

『Adobe InDesignとXMLのデザイナーズガイド』では、これを行う方法を説明しています。または、Lynda.comのビデオでInDesignとXMLを使用した動的ワークフローを確認することもできます。

とても簡単です。

差し込み印刷用に個別のPDFファイルを作成する場合は、1つのファイルにすべての名前が含まれる長いPDFを1つ実行してから、AcrobatProでPDFファイルを個別に抽出することができます。自体。

2
Jim Maivald

おそらくPDFライブラリのような iText )を見ることができます。プログラミングの知識があり、少し時間があれば、連絡先情報をに追加するコードを書くことができます。 PDF

2
Rad

誰かが詳細を尋ねました。私はそれで私の一番の答えを汚したくありませんでした、なぜならあなたはそれを好きなように行うことができるからです(そしてpdftkがそれ次第であることを知っているだけで人々にアイデアを与えるはずです)。

しかし、これが私が何年も前に使用したいくつかのスクリプトです:

csv_to_pdf.py

#!/usr/bin/python
# This makes one PDF page per name in the CSV file
# csv_to_pdf.py <CSV_FILE>

import csv
import sys
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.units import cm, mm

in_db = csv.reader(open(sys.argv[1], "rb"));
outname = sys.argv[1].replace("csv", "pdf")
pdf = Canvas(outname)
in_db.next()

i = 0
for rad in in_db:
        pdf.setFontSize(11)
        adr = rad[1]

        tekst = pdf.beginText(2*cm, 26*cm)

        for a in adr.split('\n'):
            if not a.strip():
                continue
            if a[-1] == ',':
                a = a[:-1]
            tekst.textLine(a)
        pdf.drawText(tekst)
        pdf.showPage()

        i += 1
        if i % 1000 == 0:
                print i
pdf.save()

これを実行すると、名前だけが記載された数千ページのファイルが作成されます。これは、それらすべての下で派手なPDF)を背景にできるときです:

pdftk <YOUR_NEW_PDF_FILE.pdf> background <DESIGNED_FILE.pdf> <MERGED.pdf>
1

おそらく最良の方法は、テキストが欠落している別のPDFを生成し、一方のPDFをもう一方の上にオーバーレイすることです。簡単なグーグルは、Acrobatでそれを行う方法を示すこのリンクを見つけました、そして私は他の方法もあると確信しています。

http://forums.macrumors.com/showthread.php?t=508226

1
Mark Ransom

--XMPie for Adob​​eIndesignなどの可変データプログラムを使用するのはどうですか。これは、ユーザーのリストを参照する必要があるプラグインです(ただし、Excelのリストである必要があると考えてください)。

1
user1103916

簡単な方法の1つは、Acrobatの元のドキュメントから入力可能なPDFフォームを作成し、フォームとcsvを使用して差し込み印刷を行うことです。

PDFの差し込み印刷は、python and pdftk 。Fdfgen(pip install fdfgen)はpythonライブラリであり、python配列からfdfを作成するため、Excelグリッドをcsvに保存できます。 csvヘッダーは、その列に入力するpdfフォームフィールドの名前と一致し、次のような操作を行います。

import csv
import subprocess

from fdfgen import forge_fdf

PDF_FORM = 'path/to/form.pdf'
CSV_DATA = 'path/to/data.csv'

infile = open(CSV_DATA, 'rb')
reader = csv.DictReader(infile)
rows = [row for row in reader]
infile.close()

for row in rows:
    # Create fdf
    filename = row['filename'] # Construct filename
    fdf_data = [(k,v) for k, v in row.items()]
    fdf = forge_fdf(fdf_data_strings=fdf_data)
    fdf_file = open(filename+'.fdf', 'wb')
    fdf_file.write(fdf)
    fdf_file.close()

    # Use PDFTK to create filled, flattened, pdf file
    cmds = ['pdftk', PDF_FORM, 'fill_form', filename+'.fdf',
            'output', filename+'.pdf', 'flatten', 'dont_ask']
    process = subprocess.Popen(cmds, stdout=subprocess.PIPE)
    stdout, stderr = process.communicate()
    returncode = process.poll()
    os.remove(filename+'.fdf')

私はこの問題に遭遇したので、私自身の無料の解決策を書くことができました PdfZero 。 PdfZeroには、スプレッドシートをPDFフォームとマージする差し込み印刷機能があります。PDFフォームを作成する必要がありますが、フォームとcsvをにアップロードできます。 pdfzeroで、どのフォームフィールドにどの列を入力するかを選択し、必要に応じてcsvデータを使用して、入力されたpdfごとに命名規則を作成し、入力されたPDfsをバッチ生成します。

免責事項:私はPdfZeroを書きました

1
Stephen Price

PDF)以外の形式でテンプレートを取得できない場合、簡単なアドホックソリューションは次のようになります。

  • PDFを画像に変換する
  • (OpenOffice.org)ドキュメントの背景に画像を配置します
  • 画像の上に差し込み印刷フィールドを配置する
  • 差し込み印刷と印刷を行う
1
Dirk Vollmar

混乱や混乱のないソリューションの場合は、iTextを使用してテキストをPDFに追加するだけです。たとえば、次の手順を実行して、ロードされたPDFドキュメントにテキストを追加できます。

PdfContentByte cb= ...;
cb.BeginText();
cb.SetFontAndSize(font, fontSize);
float x = ...;
float y = ...;
cb.SetTextMatrix(x, y);
cb.ShowText(fieldValue);
cb.EndText();    

そこから、別のファイルとして保存し、印刷します。

ただし、フォームフィールドは、テンプレートからPDFドキュメントを生成する方法であることがわかりました。

フォームフィールド(Adobe Acrobatで追加)を含むテンプレートがある場合は、次の2つの選択肢のいずれかがあります。

  • FDFファイルを作成します。これは、基本的にフォームのフィールドの値のリストです。 FDFは、元のドキュメントを参照する単純なテキストドキュメントであるため、PDFを開くと、FDFによって提供されたフィールド値がドキュメントに読み込まれます。
  • または、iText/iTextSharpなどのライブラリを使用してテンプレートをロードし、フォームフィールドに手動で入力して、別のpdfとして保存します。

サンプルのFDFファイルは次のようになります( Planet PDF から盗まれました):

%FDF-1.2
%âãÏÓ
1 0 obj
<<<
 /F(Example PDF Form.pdf)
 /Fields[
  <<
  /T(myTextField)
  /V(myTextField default value)
  >>
  ]
 >>
>> endobj trailer
<>
%%EOF

シンプルなフォーマットとFDFのサイズが小さいため、これが推奨されるアプローチであり、このアプローチはどの言語でもうまく機能するはずです。

プログラムでフィールドに入力する場合は、次の方法でiTextを使用できます。

PdfAcroForm acroForm = writer.AcroForm;
acroForm.Put(new PdfName(fieldInfo.Name), new PdfString(fieldInfo.Value));
1
rhanekom

免責事項:私はこのツールの作者です。

私はこの問題に何度も遭遇したので、無料のオンラインツールを作成しました: https://pdfbatchfill.com/

PDFフォームをテンプレートとして想定し、それをCSVフォームデータとともに使用して、単一のPDFまたはZipファイル内の個々のPDFを生成します。

0
davychiu

InDesignのデータマージ機能を使用することも、ジョブの一部を印刷してから、WordまたはOpenOfficeを使用してその上に差し込み印刷を印刷することで行っていたことを実行することもできます。しかし、可変データオフセット印刷や動的出版を行うことができる会社を見つけることも検討してください。前もって少し高価かもしれませんが、時間、テスト、さらにはパッケージングや郵送に関しては、バンドルを節約できます。

0
philellsworth