从图像列表中创建PDF

Mac*_*eus 52 python pdf

有没有实用的方法可以使用Python从图像文件列表中创建PDF?

在Perl我知道那个模块.有了它,我可以只用3行创建一个PDF:

use PDF::FromImage;
...
my $pdf = PDF::FromImage->new;
$pdf->load_images(@allPagesDir);
$pdf->write_file($bookName . '.pdf');
Run Code Online (Sandbox Code Playgroud)

我需要做一些与此类似的事情,但是在Python中.我知道pyPdf模块,但我想要一些简单的东西.

@编辑

如果您通过Google访问,请输入以下代码:

from fpdf import FPDF
from PIL import Image
def makePdf(pdfFileName, listPages, dir = ''):
    if (dir):
        dir += "/"

    cover = Image.open(dir + str(listPages[0]) + ".jpg")
    width, height = cover.size

    pdf = FPDF(unit = "pt", format = [width, height])

    for page in listPages:
        pdf.add_page()
        pdf.image(dir + str(page) + ".jpg", 0, 0)

    pdf.output(dir + pdfFileName + ".pdf", "F")
Run Code Online (Sandbox Code Playgroud)

小智 55

安装FPDF for Python:

pip install fpdf
Run Code Online (Sandbox Code Playgroud)

现在您可以使用相同的逻辑:

from fpdf import FPDF
pdf = FPDF()
# imagelist is the list with all image filenames
for image in imagelist:
    pdf.add_page()
    pdf.image(image,x,y,w,h)
pdf.output("yourfile.pdf", "F")
Run Code Online (Sandbox Code Playgroud)

您可以在教程页面官方文档中找到更多信息.

  • 你能说出 x,y,w 和 h 的值吗? (6认同)
  • 对于A4大小的分页pdf,w和h的值分别为210和297. (5认同)
  • 我在这种方法中遇到的问题是,由于某种原因,每个其他页面都是空白的. (3认同)
  • 对于标准 (a4) 页面,x、y、w、h 的值应该是多少?编辑:看起来像 0,0,210,297 作品 (3认同)
  • 谢谢,但我无法成功。我正在处理的图像是 JPG;FDPF 没有对 JPG 的原生支持。为此,需要 PIL。由于 PIL 不再支持 Python 3,我安装了 PILLOW。但是,FDPF 显然无法识别:“未安装 PIL”。出于测试目的,我使用 PNG 图像进行了测试,但是会导致以下错误:“不是 PNG 文件:0.png” (2认同)

Sye*_*bir 22

如果使用Python 3,则可以使用python模块img2pdf

pip3 install img2pdf使用它安装它然后你可以在脚本中使用它import img2pdf

示例代码

import os
import img2pdf

with open("output.pdf", "wb") as f:
    f.write(img2pdf.convert([i for i in os.listdir('path/to/imageDir') if i.endswith(".jpg")]))
Run Code Online (Sandbox Code Playgroud)

  • TypeError: 既没有实现 read() 也不是 str 或 bytes 给出此错误 (5认同)
  • 这曾经对我有用,但我没有收到类型错误:需要类似字节的对象,而不是 str (4认同)
  • 我无法让它使用字符串指定目录。我必须首先使用 `os.chdir('path')` 更改目录,然后使用 `[i for i in os.listdir(os.getcwd()) if i.endswith(".jpg")]` (2认同)

bil*_*p22 20

到目前为止,我尝试过将多个图像转换为PDF的最佳方法是PIL纯粹使用.它非常简单但功能强大:

from PIL import Image

im1 = Image.open("/Users/apple/Desktop/bbd.jpg")
im2 = Image.open("/Users/apple/Desktop/bbd1.jpg")
im3 = Image.open("/Users/apple/Desktop/bbd2.jpg")
im_list = [im2,im3]

pdf1_filename = "/Users/apple/Desktop/bbd1.pdf"

im1.save(pdf1_filename, "PDF" ,resolution=100.0, save_all=True, append_images=im_list)
Run Code Online (Sandbox Code Playgroud)

只需设置save_allTrueappend_images到要添加图像列表.

你可能会遇到AttributeError: 'JpegImageFile' object has no attribute 'encoderinfo'.将多个JPEG保存为多页PDF时,解决方案在此处出现错误

注意:安装最新版本PIL以确保save_allPDF参数可用.

  • 仅供参考:还可以通过添加“append_images”生成器来改进代码,例如“Image.open(image_paths[0]).save(...,append_images=(Image.open(f) for f in image_paths[ 1:]))` (其中 `image_paths` 是页面图像的路径列表)。这将避免在内存中存储大量“Image”对象。 (3认同)
  • 最好的方法,直接用PIL! (2认同)

Qas*_*wed 8

如果您的图像是您使用 matplotlib 创建的绘图,则可以使用matplotlib.backends.backend_pdf.PdfPages请参阅文档)。

import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

# generate a list with dummy plots   
figs = []
for i in [-1, 1]:
    fig = plt.figure()
    plt.plot([1, 2, 3], [i*1, i*2, i*3])
    figs.append(fig)

# gerate a multipage pdf:
with PdfPages('multipage_pdf.pdf') as pdf:
    for fig in figs:
        pdf.savefig(fig)
        plt.close()
Run Code Online (Sandbox Code Playgroud)


Tan*_*lam 6

pgmagickGraphicsMagick(Magick++)Python的绑定。

它是ImageMagick(或GraphicsMagick)的 Python 包装器。

import os
from os import listdir
from os.path import isfile, join 
from pgmagick import Image

mypath = "\Images" # path to your Image directory 

for each_file in listdir(mypath):
    if isfile(join(mypath,each_file)):
        image_path = os.path.join(mypath,each_file)
        pdf_path =  os.path.join(mypath,each_file.rsplit('.', 1)[0]+'.pdf')
        img = Image(image_path)
        img.write(pdf_path)
Run Code Online (Sandbox Code Playgroud)
Sample input Image:
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

PDF looks like this:
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Windows 的 pgmagick iinstallation 说明:

1) 从Unofficial Windows Binaries for Python Extension Packages(如 pgmagick 网页中提到的)下载预编译的二进制包并安装它。

注意:尝试下载与您机器上安装的python版本相对应的正确版本,无论是32位安装还是64位安装。

您可以通过在终端输入 python 并按 Enter 来检查您是否拥有 32 位或 64 位 python。

D:\>python
ActivePython 2.7.2.5 (ActiveState Software Inc.) based on
Python 2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Run Code Online (Sandbox Code Playgroud)

所以它有python version 2.7它的32 bit (Intel)] on win32所以你必须下载并安装pgmagick?0.5.8.win32?py2.7.exe

以下是pgmagick可用的 Python 扩展包:

  • pgmagick?0.5.8.win?amd64?py2.6.exe
  • pgmagick?0.5.8.win?amd64?py2.7.exe
  • pgmagick?0.5.8.win?amd64?py3.2.exe
  • pgmagick?0.5.8.win32?py2.6.exe
  • pgmagick?0.5.8.win32?py2.7.exe
  • pgmagick?0.5.8.win32?py3.2.exe

2) 然后您可以按照此处的安装说明进行操作。

pip install pgmagick
Run Code Online (Sandbox Code Playgroud)

然后尝试导入它。

>>> from pgmagick import gminfo
>>> gminfo.version
'1.3.x'
>>> gminfo.library
'GraphicsMagick'
>>>
Run Code Online (Sandbox Code Playgroud)


swa*_*dar 5

首先pip install pillow是命令行界面。图像可以是 jpg 或 png 格式。如果您有 2 个或更多图像并想制作 1 个 pdf 文件。

代码:

from PIL import Image

image1 = Image.open(r'locationOfImage1\\Image1.png')
image2 = Image.open(r'locationOfImage2\\Image2.png')
image3 = Image.open(r'locationOfImage3\\Image3.png')

im1 = image1.convert('RGB')
im2 = image2.convert('RGB')
im3 = image3.convert('RGB')

imagelist = [im2,im3]

im1.save(r'locationWherePDFWillBeSaved\\CombinedPDF.pdf',save_all=True, append_images=imagelist)
Run Code Online (Sandbox Code Playgroud)