Pythonを使用して既存のPDFにテキストを追加する


106

Pythonを使用して既存のPDFにいくつかの追加テキストを追加する必要があります。これを行うための最良の方法は何であり、どの追加モジュールをインストールする必要がありますか。

注:理想的には、これをWindowsとLinuxの両方で実行できるようにしたいのですが、プッシュで実行できるのはLinuxだけです。

編集:pyPDFReportLabは良さそうですが、どちらも既存のPDFを編集することを許可しません。他のオプションはありますか?

回答:


88

これは古い投稿であることは知っていますが、解決策を見つけるために長い時間を費やしました。私はReportLabとPyPDFだけを使用してまともなものに出会ったので、共有したいと思いました:

  1. を使用してPDFを読み取ります。PdfFileReader()これをこの入力と呼びます
  2. ReportLabを使用して追加するテキストを含む新しいPDFを作成し、これを文字列オブジェクトとして保存します
  3. を使用して文字列オブジェクトを読み取り、PdfFileReader()このテキストを呼び出します
  4. を使用して新しいPDFオブジェクトを作成しPdfFileWriter()ます。この出力を呼び出します
  5. 入力を反復処理して.mergePage(*text*.getPage(0))、テキストを追加する各ページに適用し、次に、を使用output.addPage()して、変更されたページを新しいドキュメントに追加します

これは単純なテキストの追加に適しています。文書に透かしを入れる方法については、PyPDFのサンプルを参照してください。

以下は、以下の質問に答えるためのコードです。

packet = StringIO.StringIO()
can = canvas.Canvas(packet, pagesize=letter)
<do something with canvas>
can.save()
packet.seek(0)
input = PdfFileReader(packet)

ここから、入力ファイルのページを別のドキュメントとマージできます。


2
「ReportLabを使用して追加するテキストを含む新しいPDFを作成し、これを文字列オブジェクトとして保存します」どのように実行しますか?そのキャンバスインスタンスです。
ラクシュマンプラサード

1
上記のサンプルコードを追加して、ラクシュマンの質問に答えました。
2010

:私はそれがより更新されるため、また、そのサンプルコードをチェックPyPDF2を使用することをお勧めしますgithub.com/mstamy2/PyPDF2/blob/...を
火災

2
このコードは新しいPDFファイルを作成し、すべてのメタデータをスキップします。そのため、既存のPDFに追加されません。
アントンKukoba

124

[Python 2.7]の例:

from pyPdf import PdfFileWriter, PdfFileReader
import StringIO
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = StringIO.StringIO()
# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(10, 100, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(file("original.pdf", "rb"))
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# finally, write "output" to a real file
outputStream = file("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()

Python 3.xの例:


from PyPDF2 import PdfFileWriter, PdfFileReader
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = io.BytesIO()
# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(10, 100, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader(open("original.pdf", "rb"))
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# finally, write "output" to a real file
outputStream = open("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()

13
python3の場合、パケットはio.BytesIOpyPDF(メンテナンスされていない)ではなくPyPDF2である必要があります。正解です。
Noufal Ibrahim 2016

4
共有いただきありがとうございます。それは素晴らしい働きをします。注:のopen代わりに使用する方が良いと思いますfile
mitenka 2016

特に実用的な例が含まれているため、これはより受け入れられる答えだと思います。
ケーシー

1
注意:新しいドキュメントには、オリジナルの最初のページのみが含まれています。それから、ページの残りの部分をコピーする簡単な十分だexisting_pdfoutput、サンプルコードでは、ちょうどありません。
アレクシス2017

@alexis:pdfの2ページ目に何かを配置するようにコードをどのように変更しますか?2ページを使用するフォームがあり、最初のページが表示されません。前もって感謝します。
DavidV

11

pdfrwを使用すると、既存のPDFからページを読み取り、それらをreportlabキャンバスに描画できます(画像の描画と同様)。この例は、githubのpdfrw examples / rl1サブディレクトリにあります。免責事項:私はpdfrwの作者です。


私はあなたがそこにリンクを置くことができると思います
The6thSense 2015

いい視点ね!私はそれを投稿したとき、あまりSOのことをしていなかったので、「最小限のテキストとリンクのポリシー」について心配していました。(私の担当者は当時46歳で、IIRCは1つの回答で-2を受け取ったばかりだったため、5年前の質問に対する新しい回答について少し心配でした:)
Patrick Maupin

古い質問はより多くの見解を得ます:)そして注目
The6thSense

FWIW、このリンクをたどると、いくつかのreportlab / pdfrwの例があります。だまされたターゲットの答えに基づいて、私はそこで答えました。
Patrick Maupin

7

活用デビッドDehghan答えを Pythonの2.7.13で、次の作品は、上記:

from PyPDF2 import PdfFileWriter, PdfFileReader, PdfFileMerger

import StringIO

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

packet = StringIO.StringIO()
# create a new PDF with Reportlab
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(290, 720, "Hello world")
can.save()

#move to the beginning of the StringIO buffer
packet.seek(0)
new_pdf = PdfFileReader(packet)
# read your existing PDF
existing_pdf = PdfFileReader("original.pdf")
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page.mergePage(new_pdf.getPage(0))
output.addPage(page)
# finally, write "output" to a real file
outputStream = open("destination.pdf", "wb")
output.write(outputStream)
outputStream.close()

3

cpdfはコマンドラインからジョブを実行します。しかし、それはpythonではありません(afaik):

cpdf -add-text "Line of text" input.pdf -o output .pdf

0

PDFを編集可能な形式に変換し、変更を書き込んでからPDFに変換し直すことで、問題を解決できるかもしれません。PDFを直接編集できるライブラリは知りませんが、たとえばDOCとPDFの間にはたくさんのコンバーターがあります。


1
問題は、(サードパーティからの)PDFのソースしか持っておらず、PDF-> DOC-> PDFが変換で多く失われることです。また、Linuxで実行するにはこれが必要なので、DOCは最適な選択ではない可能性があります。
Frozenskys 2009

私は、AdobeがPDF編集機能をかなり閉鎖的かつ独自仕様にしており、Acrobatのより優れたバージョンのライセンスを販売できると信じています。たぶん、ある種のマクロインターフェイスを使用して、Acrobat Proの編集を自動化する方法を見つけることができるでしょう。
aehlke 2009

書き込みたいパーツがフォームフィールドである場合、それらを編集するためのXMLインターフェイスがあります。それ以外の場合は何も見つかりません。
aehlke

いいえ、各ページに数行のテキストを追加したかっただけです。
Frozenskys 2009

0

あなたがWindowsを使っているなら、これはうまくいくかもしれません:

PDFクリエイターパイロット

PythonでのPDF作成および編集フレームワークのホワイトペーパーもあります。それは少し古いですが、おそらくあなたにいくつかの有用な情報を与えることができます:

PythonをPDF編集および処理フレームワークとして使用する


ホワイトペーパーは見栄えは良いですが、コードについては少し軽めです。私には、PDFフレームワーク全体を実装するためのリソースがありません。;)
Frozenskys 2009

-4

pyPdfを試しましたか?

申し訳ありませんが、ページのコンテンツを変更することはできません。


それはうまくいくように見えます、誰かがそれを使ったことがありますか?どのようなメモリ使用量ですか?
Frozenskys、2009

テキストの透かしを追加する機能があり、適切にフォーマットされていれば動作する可能性があります。
Frozenskys 2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.