2017-11-30 21 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()でも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.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() 
関連する問題