Добавить текст в существующий документ PDF в Python - PullRequest
8 голосов
/ 25 июля 2011

Я пытаюсь преобразовать pdf в файл того же размера, что и мой pdf, который является страницей формата A4.

convert my_pdf.pdf -density 300x300 -page A4 my_png.png

В результате png-файл имеет размер 595px × 842px, что должно бытьразрешение в 72 точек на дюйм.Я думал об использовании PIL для написания текста в некоторых полях pdf и преобразования его обратно в PDF.Но в настоящее время изображение получается неправильным.

Редактировать: Я подходил к проблеме с неправильного угла.Правильный подход вообще не включал imagemagick.

Ответы [ 4 ]

28 голосов
/ 25 июля 2011

Обыскав некоторых, я наконец нашел решение: Оказывается, этот был правильным подходом в конце концов.Тем не менее, я чувствую, что это было недостаточно многословно.Похоже, что постер, вероятно, взял его от здесь (те же имена переменных и т. Д.).

Идея: создать новый пустой PDF с Reportlab, который содержит только текстовую строку.Затем объедините / добавьте его в качестве водяного знака, используя pyPdf.

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(100,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("mypdf.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("/home/joe/newpdf.pdf", "wb")
output.write(outputStream)
outputStream.close()

Надеюсь, это поможет кому-то еще.

8 голосов
/ 26 марта 2015

Я только что попробовал решение выше, но у меня были некоторые проблемы с его запуском в Python3. Итак, я хотел бы поделиться своими модификациями. Адаптированный код выглядит следующим образом:

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(100, 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("mypdf.pdf", "rb"))
output = PdfFileWriter()
# add the "watermark" (which is the new pdf) on the existing page
page = existing_pdf.getPage(0)
page2 = new_pdf.getPage(0)
page.mergePage(page2)
output.addPage(page)
# finally, write "output" to a real file
outputStream = open("newpdf.pdf", "wb")
output.write(outputStream)
outputStream.close()

Теперь page.mergePage выдает ошибку. Оказывается, ошибка переноса в pypdf2. Пожалуйста, обратитесь к этому вопросу для решения: Портирование на Python3: PyPDF2 mergePage () дает TypeError

3 голосов
/ 25 июля 2011

Вы должны посмотреть на Добавить текст в существующий PDF, используя Python , а также Python в качестве среды редактирования и обработки PDF . Они укажут вам правильное направление.

Если вы сделаете то, что предложили в вопросе, при экспорте обратно в .pdf это будет просто файл изображения, встроенный в .pdf, это не будет текст.

2 голосов
/ 11 июля 2015

pdfrw позволит вам взять существующие PDF-файлы и разместить их как XObjects формы (аналогично изображениям) на холсте отчета.Для этого есть несколько примеров в подкаталоге pdfrw examples / rl1 на github.Отказ от ответственности - я автор pdfrw.

...