2017-11-30 22 views
0

일부 위치에서 PDF 파일에 문자열을 쓰려고합니다. 나는이 작업을 수행 할 수있는 방법을 발견하고 이런 식으로 구현 :python3에서 PDF를 통해 텍스트 작성

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

packet = io.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() 

그것은 can.save() 줄에서 나에게 오류가 발생

오류

:

File "/home/corleone/miniconda3/lib/python3.6/site-packages/reportlab/pdfgen/canvas.py", line 1237, in save 
    self._doc.SaveToFile(self._filename, self) 
    File "/home/corleone/miniconda3/lib/python3.6/site-packages/reportlab/pdfbase/pdfdoc.py", line 224, in SaveToFile 
    f.write(data) 
TypeError: string argument expected, got 'bytes' 

는 많은에서 최대 읽고 인터넷상의 장소. 모든 곳에서 동일한 방법을 찾았습니다. 그렇게하는 것이 잘못된 방법일까요? 내가 놓친 게 있니?

답변

2

결국 나는 StringsIO 대신 BytesIO을 사용해야했습니다.

또한 file() 대신에 open()인데 파이썬 3을 사용하고 있습니다.

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.setFont('Helvetica-Bold', 24) 
can.drawString(10, 100, "Hello world") 
can.showPage() 
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() 
: 여기

는 작업 스크립트입니다