Добавление текста в существующий PDF с помощью Python
Мне нужно добавить дополнительный текст в существующий PDF с помощью Python, каков наилучший способ сделать это и какие дополнительные модули мне нужно будет установить.
Примечание: В идеале я хотел бы иметь возможность запускать это как на Windows, так и на Linux, но при нажатии Linux только будет делать.
Edit: pyPDF и ReportLab выглядят хорошо, но ни один из них не позволит мне редактировать существующий PDF, есть ли другие варианты?
8 ответов:
Я знаю, это старый пост, но я провел много времени, пытаясь найти решение. Я наткнулся на приличный, используя только ReportLab и PyPDF, поэтому я подумал, что поделюсь:
- читать PDF с помощью PdfFileReader (), мы будем называть это вход
- создайте новый pdf-файл, содержащий ваш текст для добавления с помощью ReportLab, сохраните его как строковый объект
- прочитайте строковый объект с помощью PdfFileReader (), мы будем называть это текст
- создать новый объект PDF с помощью PdfFileWriter (), мы будем называть это выход
- перебираем вход и применить .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-файлов в Python. Это немного устарело, но, возможно, может дать вам некоторую полезную информацию:
использование Python в качестве рамки редактирования и обработки PDF
возможно, вам больше повезет, разбив проблему на преобразование PDF в редактируемый формат, написание изменений, а затем преобразование его обратно в PDF. Я не знаю библиотеки, которая позволяет напрямую редактировать PDF, но есть много конвертеров между DOC и PDF, например.
вы пробовали pyPdf ?
извините, он не имеет возможности изменять содержимое страницы.