曾静的博客

但行好事,莫问前程.

嗨,我是曾静 (@devzeng),目前暂居深圳。


这是我用来记录平日学习笔记的地方,欢迎您的访问.

使用Python合并图片生成PDF文件

最近做了一个小功能,将一个页面上面的所有图片下载下来生成一个PDF文件。发现了一个非常好用的库reportlab, pyPdf。只需要几行代码就能实现功能,如果没有安装可以通过pip安装:

pip install reportlab -i https://pypi.douban.com/simple
pip install pyPdf -i https://pypi.douban.com/simple

注: -i表示使用豆瓣的镜像服务

操作过程

下面记录下我的处理的过程:

(1)如果只是简单的需要将图片进行拼接成PDF可以直接使用如下的方式:

from reportlab.lib.pagesizes import A4, portrait, landscape
from reportlab.pdfgen import canvas

def convert_images_to_pdf(img_path, pdf_path):
    pages = 0
    (w, h) = portrait(A4)
    c = canvas.Canvas(pdf_path, pagesize = portrait(A4))
    l = os.listdir(img_path)
    l.sort(key= lambda x:int(x[:-4]))
    for i in l:
        f = img_path + os.sep + str(i)
        c.drawImage(f, 0, 0, w, h)
        c.showPage()
        pages = pages + 1
    c.save()

(2)如果需要根据不同的尺寸的图片设置横屏还是竖屏模式,可以考虑使用如下方式实现:

import os, shutil
from PIL import Image
from reportlab.lib.pagesizes import A4, portrait, landscape
from reportlab.pdfgen import canvas
from pyPdf import PdfFileWriter, PdfFileReader

def convert_image_to_pdf(img_path, pdf_path):
    img = Image.open(img_path)
    (w0, h0) = img.size
    if w0 > h0:
        (w, h) = landscape(A4)
        c = canvas.Canvas(pdf_path, pagesize = landscape(A4))
        c.drawImage(img_path, 0, 0, w, h)
        c.showPage()
        c.save()
    else:
        (w, h) = portrait(A4)
        c = canvas.Canvas(pdf_path, pagesize = portrait(A4))
        c.drawImage(img_path, 0, 0, w, h)
        c.showPage()
        c.save()

def convert_images_to_pdf(img_path, pdf_path):
    pages = 0
    tmp_path = '.' + os.sep + 'temp'
    if not os.path.exists(tmp_path):
        os.mkdir(tmp_path)
    list = os.listdir(img_path)
    list.sort(key=lambda x:int(x[:-4]))
    output = PdfFileWriter()
    for item in list:
        img = img_path + os.sep + str(item)
        pdf = tmp_path + os.sep + str(pages + 1) + ".pdf"
        convert_image_to_pdf(img, pdf)
        input = PdfFileReader(file(pdf, "rb"))
        pageCount = input.getNumPages()
        pages = pages + 1
        for iPage in range(0, pageCount):
            output.addPage(input.getPage(iPage))
    outputStream = file(pdf_path, "wb")
    output.write(outputStream)
    outputStream.close()
    shutil.rmtree(tmp_path)

参考资料

1、ReportLab PDF Library User Guide

2、python合并PDF文件

最近的文章

使用StatSVN对SVN日志进行可视化分析

StatSVN是一个开源的SVN统计工具(Java语言编写,最近一次更新是2010-01-01),能够从Subversion版本库中取得信息,然后生成描述项目开发的各种表格和图表(StatSVN生成的报表是一组包括表格与图表的静态HTML文档)。比如: 代码行数的时间线; 针对每个开发者的代码行数; 开发者的活跃程度; 开发者最近所提交的; 文件数量; 平均文件大小; 最大文件; 哪个文件是修改最多次数的; 目录大小; 带有文件数量和代码行数的Repository tr...…

Note继续阅读
更早的文章

在Docker上运行Scrapy

之前使用Scrapy写过一个空气质量的采集程序,最近要切换到另外一台服务器上面去,折腾了几个小时的安装环境还是没跑起来。几次之后就放弃了,刚好那台服务器上面安装了Docker的环境,运行了一个Nexus的服务几个月来一直都很稳定,那为啥不可以把Scrapy也放在上面运行呢?操作过程下面记录下我的处理的过程:(1)创建dockfile在scrapy.cfg文件所在的目录下面创建dockfile,里面的内容如下:FROM ubuntuMAINTAINER hhtczengjing@gmail....…

Docker继续阅读