如何在Python中创建PDF文件


156

我正在一个项目中,该项目从用户那里获取一些图像,然后创建一个包含所有这些图像的PDF文件。

有什么方法或工具可以在Python中做到这一点吗?例如要从image1 + image 2 + image 3-> PDF文件创建PDF文件(或eps,ps)?


47
如果有疑问,前缀无论你是通过搜索py;-)
MJV

8
另一种SO搜索技巧:[language or tag] some_keyword[python] PDF[python] PDF image
mjv 2010年

对于那些来到这里使用matplolib:stackoverflow.com/questions/17788685/...
大卫公园

我否决了这个问题,因为公认的答案是错误的答案
。...– boatcoder

Answers:


39

我建议pyPdf。它真的很好。不久前,我也写了一篇博客文章,您可以在这里找到它。


7
PyPDF2的当前分叉位于此处
Edmond Burnett

98
请注意,pypdf仅剪切/粘贴/等。现有的pdf内容-您无法在pdf中添加文本或图像。
drevicko 2014年

3
pyPDF2不适用于创建新的PDF文档4cs
michelek

160

遵循此页面上的提示后,这是我的经验。

  1. pyPDF无法将图像嵌入文件中。它只能拆分和合并。(来源:Ctrl + F通过其文档页面)这很好,但是如果您的图像尚未嵌入PDF中,则不行。

  2. pyPDF2似乎在pyPDF之上没有任何其他文档。

  3. ReportLab非常广泛。(Userguide)但是,通过一点Ctrl + F并通过其源代码进行grepping,我得到了:

    • 首先,下载Windows安装程序源代码
    • 然后在Python命令行上尝试:

      from reportlab.pdfgen import canvas
      from reportlab.lib.units import inch, cm
      c = canvas.Canvas('ex.pdf')
      c.drawImage('ar.jpg', 0, 0, 10*cm, 10*cm)
      c.showPage()
      c.save()
      

我需要做的就是将一堆图像转换成PDF,以便检查它们的外观并进行打印。以上足以实现该目标。

ReportLab很棒,但可以从其文档中突出显示的helloworlds中受益。


13
我必须说reportlab是我尝试过的最适合PDF生成的,绝对是最完整的。但是,它也更加复杂。blog.pythonlibrary.org/2010/03/08/... blog.pythonlibrary.org/2010/09/21/...
何塞·萨尔瓦

1
这正是我一直在寻找的东西
马尔滕,

@JoseSalvatierra感谢Jose ...这真的很容易。感谢您的博客链接。
阿林丹·罗伊肖杜里

33

我建议使用Pdfkit。(安装指南

它从html文件创建pdf。我选择从Python金字塔堆栈通过2个步骤创建pdf:

  1. 使用mako模板在服务器端呈现您想要的样式和标记pdf文档
  2. pdfkit.from_string(...)通过将呈现的html作为参数传递的执行方法

这样,您将获得包含样式和图像的pdf文档。

您可以按以下方式安装它:

  • 使用点

    pip install pdfkit

  • 您还需要在Ubuntu上安装wkhtmltopdf 。

14

您可以尝试使用这种方法(Python-for-PDF-Generation),也可以尝试使用PyQt,它支持打印到pdf。

用于生成PDF的Python

可移植文档格式(PDF)使您可以创建在每个平台上看起来完全相同的文档。但是,有时需要动态生成PDF文档,这可能是一个很大的挑战。幸运的是,有一些库可以提供帮助。本文研究了其中一种适用于Python的方法。

http://www.devshed.com/c/a/Python/Python-for-PDF-Generation/#whoCFCPh3TAks368.99上了解更多信息


链接不再起作用。
罗伯特·科赫

9

这是仅适用于标准软件包的解决方案。matplotlib有一个PDF后端,可以将图形保存为PDF。您可以创建带有子图的图形,其中每个子图都是您的图像之一。您完全可以随意摆弄图形:添加标题,按位置播放等。完成图形后,保存为PDF。每次调用savefig都会创建另一页PDF。

下面的示例在第1页和第2页上并排绘制2张图像。

from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
from scipy.misc import imread
import os
import numpy as np

files = [ "Column0_Line16.jpg", "Column0_Line47.jpg" ]
def plotImage(f):
    folder = "C:/temp/"
    im = imread(os.path.join(folder, f)).astype(np.float32) / 255
    plt.imshow(im)
    a = plt.gca()
    a.get_xaxis().set_visible(False) # We don't need axis ticks
    a.get_yaxis().set_visible(False)

pp = PdfPages("c:/temp/page1.pdf")
plt.subplot(121)
plotImage(files[0])
plt.subplot(122)
plotImage(files[1])
pp.savefig(plt.gcf()) # This generates page 1
pp.savefig(plt.gcf()) # This generates page 2
pp.close()

在我的测试中,代码生成包含2张图像的单页
构造函数


7

我在PyQt中做了很多,而且效果很好。Qt对图像,字体,样式等具有广泛的支持,所有这些都可以写到pdf文档中。


1
哇,Qt看起来很棒。他们说他们支持15个平台公司。Windows,Mac OS X,Linux,Android,iOS,Windows RT以及这些实时操作系统-完整性QNX VxWorks qt.io/qt-framework。而且,由于我是python的粉丝,所以我喜欢“ PyQt结合了Qt和Python的所有优点。程序员拥有Qt的全部功能,但是能够通过Python的简单性来利用它。” riverbankcomputing.co.uk / software / pyqt / intro
AnneTheAgile 2014年


7

fpdf是python(也是)。并经常使用。请参阅PyPI /点子搜索。但也许将其从pyfpdf重命名为fpdf。来自功能:PNG,GIF和JPG支持(包括透明度和Alpha通道)


1
您的答案尚不清楚,但是您的人肯定是PyFPDF pfoject pyfpdf.readthedocs.io/en/latest
Wojciech Kaczmarek

命名中的所有混乱实在是太可惜了。@WojciechKaczmarek的答案和评论确实值得更多的批评和关注。PyFPDF是最初使用PHP编写的常用PDF库的python端口。
Ideogram

6

我使用rst2pdf来创建pdf文件,因为我对RST比对HTML更熟悉。它支持嵌入几乎任何种类的栅格或矢量图像。

它需要reportlab,但是我发现reportlab并不是那么直接使用(至少对我而言)。



3

这取决于图像文件的格式,但是对于这里正在工作的项目,我使用了RemoteSensing.org的 LibTIFF中的tiff2pdf工具。基本上,只是使用了子进程来调用tiff2pdf.exe,并带有适当的参数来读取我拥有的tiff类型并输出我想要的pdf类型。如果它们不是tiff,则可以使用PIL将其转换为tiff,或者可以找到一种更适合于您的图像类型的工具(如果图像多种多样,则可以使用更通用的工具),例如上面提到的ReportLab。


3

fpdf对我来说效果很好。比ReportLab简单得多,而且真正免费。与UTF-8一起使用。


2
链接/描述:fpdf.org FPDF是一个PHP类,它允许使用纯PHP生成PDF文件,也​​就是说,无需使用PDFlib库。FPDF中的F表示免费:您可以将其用于任何用途,并对其进行修改以适合您的需求。FPDF还有其他优点:高级功能。以下是其主要功能列表:度量单位,页面格式和边距的选择,页面页眉和页脚管理,自动分页符,自动换行和文本对齐,图像支持(JPEG,PNG和GIF),颜色,链接, TrueType,Type1和编码支持,页面压缩
AnneTheAgile 2014年

12
考虑到问题是关于Python而非PHP的,因此不太相关
-KingRadical

1
为什么这一切令人沮丧?fpdf也可用于python。点安装
fpdf

1
fpdf可能已开始使用php。但是有一个python端口确实很好用。因此,我认为这是一个非常相关的答案,应该得到更多的赞成票而不是反对票。(我不确定最初发布此答案时的情况)
Sumudu

3

rinohtype支持(本地)嵌入PDF,PNG和JPEG图像以及其他位图格式(安装Pillow时)。

(全部披露:我是rinohtype的作者)


1
嘿! 如果我错了,请纠正我,但它似乎是一个非常强大的工具,与许多其他工具不同,这里列出的许多其他工具都不是古老的php / ruby​​ / perl / pyqt4 / other废话库的python包装器。
Mikaelblomkvistsson

3

如果您熟悉LaTex,则可能要考虑使用pylatex

pylatex的优点之一是易于控制图像质量。pdf中的图像将具有与原始图像相同的质量。使用reportlab时,我感到图像被自动压缩,并且图像质量降低了。

pylatex的缺点在于,由于它基于LaTex,因此很难将图像准确地放置在页面上所需的位置。但是,我发现在Figure类中使用position参数,有时在Subfigure中使用,可以得到足够好的结果。

用于创建带有单个图像的pdf的示例代码:

from pylatex import Document, Figure

doc = Document(documentclass="article")
with doc.create(Figure(position='p')) as fig:
fig.add_image('Lenna.png')

doc.generate_pdf('test', compiler='latexmk', compiler_args=["-pdf", "-pdflatex=pdflatex"], clean_tex=True)

除了安装pylatex(pip install pylatex)外,您还需要安装LaTex。对于Ubuntu和其他Debian系统,您可以运行sudo apt-get install texlive-full。如果您使用的是Windows,我建议您使用MixTex

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.