web-dev-qa-db-ja.com

既存のテキストを追加PDF using Python

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

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

編集: pyPDF および ReportLab 見栄えは良いが、どちらも既存のPDFの編集を許可しない。他のオプションはあるか?

91
Frozenskys

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

  1. あなたのPDFを使用してPdfFileReader()を使用して、これを呼び出しますinput
  2. reportLabを使用して追加するテキストを含む新しいPDFを作成し、これを文字列オブジェクトとして保存します
  3. PdfFileReader()を使用して文字列オブジェクトを読み取り、これを呼び出しますtext
  4. 新しいPDF PdfFileWriter()を使用してオブジェクトを作成します。これを呼び出しますoutput
  5. inputを反復処理し、テキストを追加する各ページに.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)

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

78
dwelch

[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()
101
David Dehghan

pdfrw を使用すると、既存のPDFからページを読み込み、レポートラボキャンバスに描画できます(画像の描画に似ています)。pdfrwにはこの例があります。 examples/rl1 githubのサブディレクトリ免責事項:私はpdfrwの著者です。

8
Patrick Maupin

David Dehghananswer を利用して、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()
6
Ross Smith II

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

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

Windowsを使用している場合、これは機能する可能性があります。

PDF Creator Pilot

PythonでのPDF作成および編集フレームワーク。

Python as PDF編集および処理フレームワーク

0
thedz

問題を解決して、PDFを編集可能な形式に変換し、変更を書き込み、それをPDFに変換し直すことができます。直接編集できるライブラリはありませんPDFしかし、DOCとPDF。

0
aehlke