Добавление текста в существующий PDF с помощью Python


Мне нужно добавить дополнительный текст в существующий PDF с помощью Python, каков наилучший способ сделать это и какие дополнительные модули мне нужно будет установить.

Примечание: В идеале я хотел бы иметь возможность запускать это как на Windows, так и на Linux, но при нажатии Linux только будет делать.

Edit: pyPDF и ReportLab выглядят хорошо, но ни один из них не позволит мне редактировать существующий PDF, есть ли другие варианты?

8 68

8 ответов:

Я знаю, это старый пост, но я провел много времени, пытаясь найти решение. Я наткнулся на приличный, используя только ReportLab и PyPDF, поэтому я подумал, что поделюсь:

  1. читать PDF с помощью PdfFileReader (), мы будем называть это вход
  2. создайте новый pdf-файл, содержащий ваш текст для добавления с помощью ReportLab, сохраните его как строковый объект
  3. прочитайте строковый объект с помощью PdfFileReader (), мы будем называть это текст
  4. создать новый объект PDF с помощью PdfFileWriter (), мы будем называть это выход
  5. перебираем вход и применить .mergePage (текст.getPage (0)) для каждой страницы, на которую вы хотите добавить текст, затем используйте выход.addPage() для добавления измененных страниц в новый документ

это работает и для простых текстовых дополнений. См. образец pypdf для водяных знаков a документ.

вот некоторый код, чтобы ответить на вопрос ниже:

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

отсюда вы можете объединить страницы входного файла с другим документом

пример для [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()

использование Дэвид Дегхан ' s ответ выше, следующие работы в 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()

pdfrw позволит вам читать страницы из существующего PDF и рисовать их на холсте reportlab (аналогично рисованию изображения). Есть примеры для этого в pdfrw примеры/rl1 подкаталог на github. Отказ от ответственности: я автор pdfrw.

cpdf будет выполнять работу из командной строки. Это не питон, хотя (afaik):

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

Если вы находитесь на Windows, это может работать:

PDF Creator Pilot

существует также технический документ для создания и редактирования PDF-файлов в Python. Это немного устарело, но, возможно, может дать вам некоторую полезную информацию:

использование Python в качестве рамки редактирования и обработки PDF

возможно, вам больше повезет, разбив проблему на преобразование PDF в редактируемый формат, написание изменений, а затем преобразование его обратно в PDF. Я не знаю библиотеки, которая позволяет напрямую редактировать PDF, но есть много конвертеров между DOC и PDF, например.

вы пробовали pyPdf ?

извините, он не имеет возможности изменять содержимое страницы.