2011-07-25 102 views
5

我试图将PDF转换为与PDF格式相同的A4尺寸页面。 将文本添加到Python中的现有PDF文档中

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

但是,生成的png文件是595px×842px,它应该是72 dpi的分辨率。 我正在考虑使用PIL在一些pdf字段上写一些文本并将其转换回PDF。但目前形象出现了错误。

编辑:我是从错误的角度来接近问题。正确的方法根本不包括imagemagick。

+2

您正在将文本文件转换为图像文件以向其写入文本以将其转换回混合图像/文本格式?有__no way__这是注释“.pdf”或填写“.pdf”表单的最佳方式。 – agf

+0

你可能是对的。我似乎无法找到一个正确的方法来修改现有的PDF在Python中:/ –

+0

可能重复的[使用Python添加文本到现有的PDF](http://stackoverflow.com/questions/1180115/add-text-to-existing -pdf-using-python) – bain

回答

2

你应该看看Add text to Existing PDF using PythonPython as PDF Editing and Processing Framework。这些将指向你正确的方向。

如果您按照您提出的问题进行操作,那么当您导出回.pdf时,它实际上只是一个嵌入在.pdf中的图像文件,它不会是文本。

+0

我接受了你的答案,因为你让我重读那篇文章(第一个链接)并且导致了解决方案。谢谢。 –

+0

我为你+1了,因为现在我已经有了一个已知的工作脚本,当我需要自己做这件事的时候:) – agf

21

经过搜索,我终于找到了解决方案: 事实证明,this毕竟是正确的方法。然而,我觉得这并不够冗长。 似乎海报可能从here(相同的变量名称等)。

想法:使用Reportlab创建新的空白PDF,其中只包含文本字符串。 然后使用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() 

希望这可以帮助别人。

5

我刚刚尝试了上面的解决方案,但我在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中的移植错误。请参考此问题的解决方案:Porting to Python3: PyPDF2 mergePage() gives TypeError

2

pdfrw将让您获取现有的PDF并将它们作为表单XObjects(类似于图像)放置在reportlab画布上。在github的pdfrw examples/rl1子目录中有一些这样的例子。免责声明 - 我是pdfrw作者。