Python处理PDF及生成多层PDF

Python提供了众多的PDF支持库,本文是在Python3环境下,试用了两个库来完成PDF的生成的功能。PyPDF对于读取PDF支持较好,但是没找到生成多层PDF的方法。Reportlab看起来更成熟,能够利用Canvas很方便的生成多层PDF,这样就能够实现图片扫描上来的内容也可以进行内容搜索的目标。

Reportlab

生成双层PDF

双层PDF应用PDF中的Canvas概念,先画文字,最后将图片画上去,这样就是两层的PDF。

import os
# import urllib2
import time
from reportlab import platypus
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.platypus import SimpleDocTemplate, Image
from reportlab.pdfgen import canvas

image_file = "./42.png"

# Use Canvas to generate pdf
c = canvas.Canvas('reportlab_canvas.pdf', pagesize=letter)
width, height = letter

c.setFillColorRGB(0,0.77,0.77)
# say hello (note after rotate the y coord needs to be negative!)
c.drawString( 3*inch, 3*inch, "Hello World")
c.drawImage(image_file, 0 , 0)
c.showPage()
c.save()

PyPDF2

读取PDF

from PyPDF2 import PdfFileWriter, PdfFileReader

output = PdfFileWriter()
input1 = PdfFileReader(open("jquery.pdf", "rb"))

# print document info
print(input1.getDocumentInfo())

# print how many pages input1 has:
print ("pdf_document.pdf has %d pages." % input1.getNumPages())

# print page content
page_content = input1.getPage(0).extractText()
print( page_content )

# add page 1 from input1 to output document, unchanged
output.addPage(input1.getPage(0))

# add page 2 from input1, but rotated clockwise 90 degrees
output.addPage(input1.getPage(1).rotateClockwise(90))

# finally, write "output" to document-output.pdf
outputStream = open("PyPDF2-output.pdf", "wb")
output.write(outputStream)

但是PyPDF获取PDF内容有很多问题,可以看这个问题列表。文档中也有说明。

| extractText(self) | ## | # Locate all text drawing commands, in the order they are provided in the | # content stream, and extract the text. This works well for some PDF | # files, but poorly for others, depending on the generator used. This will | # be refined in the future. Do not rely on the order of text coming out of | # this function, as it will change if this function is made more | # sophisticated. | #
| # Stability: Added in v1.7, will exist for all future v1.x releases. May | # be overhauled to provide more ordered text in the future. | # @return a unicode string object

参考资料:
1、PDF 1.0
2、PyPDF 2
3、PyPDF2 Homepage
4、PyPDF2 Documentation
5、python name 'file' is not defined的解决办法
6、ReportLab
7、用Python/reportlab生成PDF
8、Writing Pdf with Python: Add image

时间: 2024-10-31 11:46:38

Python处理PDF及生成多层PDF的相关文章

对itext导出PDF的一些小总结,以及ireport中生成中文PDF

也许大家和我一样,为了pdf生成时产生中文而苦恼,也许你和我一样,看到别人提供了一堆的jar,而找不到下载的地方,我也是找了好久才找到最后的大本营的,特写出来,方便你我他;) 也算给自己1个多小时的时间的一点见证吧.-_# 你只要去 http://prdownloads.sourceforge.net/itext/ 就可以找到所有你想要的东西.包括itext最新版本,itext亚洲语言包 ======================== 官方网站的http://itext.sourceforge

c# winform pdf 打印-求助:C# 怎么将一个winform画面生成一个pdf文件?

问题描述 求助:C# 怎么将一个winform画面生成一个pdf文件? 大家好,本人现在在做一个项目,需要把一个winform画面生成pdf文件,可是在网上查了一些资料,都说的很不全面,请哪位大神看到后帮忙指导一下,最好给出详细步骤,比如要安装什么辅助软件之类的,非常感谢了

html pdf div 倾斜-html转成pdf,想在pdf上生成两行倾斜的文字(div里面的),怎么倾斜这个div呢

问题描述 html转成pdf,想在pdf上生成两行倾斜的文字(div里面的),怎么倾斜这个div呢 我在java端,使用stringbuffer拼接了一个htlm字符串,用来生成pdf,怎么实现两行文字倾斜的效果呢?

PHP中使用Imagick读取pdf并生成png缩略图实例_php技巧

pdf生成png首页缩略图 (服务器需要支持Imagick)  复制代码 代码如下:   /** * PDF2PNG    * @param $pdf  待处理的PDF文件 * @param $path 待保存的图片路径 * @param $page 待导出的页面 -1为全部 0为第一页 1为第二页 * @return      保存好的图片路径和文件名 */   function pdf2png($pdf,$path,$page=0)  {       if(!is_dir($path)) 

java在pdf中生成表格的方法_java

1.目标 在pdf中生成一个可变表头的表格,并向其中填充数据.通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格. 每天生成一个文件夹存储生成的pdf文件(文件夹的命名是年月日时间戳),如:20151110 生成的文件可能在毫秒级别,故文件的命名规则是"到毫秒的时间戳-uuid",如:20151110100245690-ece540e5-7737-4ab7-b2d6-87bc23917c8c.pdf 通过读取properti

急急急!!!Qt输出PDF,如何去除PDF底端页码

问题描述 急急急!!!Qt输出PDF,如何去除PDF底端页码 使用QPrinter+QTextDocument的方式输出PDF文件,如何去除底端的页码(默认是自动添加页码的)?? 解决方案 http://zhidao.baidu.com/link?url=CMFedAL3ZO9cm3vYgnpYZZdslu9NVtr5qN3m2WE5va7BHxO1qLkUE5dUaJ91U5jksOsdGuk-lN5PqVWm7oOnS_ 解决方案二: PDF自动生成页码 解决方案三: http://blog

WORD转换成PDF后如何减少PDF文件的大小

WORD转换成PDF后发现pdf挺大的,为了不改变pdf内容,且尽量不改变质量,使用Adobe Acrobat的"另存为"功能,可能减少PDF的大小,这是个非常实用的技巧,可以避免我们的PDF文档过大,为文档"瘦身". "减少文件大小"命令可以重新取样和压缩图像.删除嵌入的 14 款基本字体和将所剩嵌入字体嵌入子集字体.它也可以压缩文档结构和整理元素,如无效的书签.如果文件大小已经足够小,则本命令不会起作用. 方法和步骤 1.打开一个 PDF,或

delphi 用控件打开pdf文件无法读取pdf里的表单信息

问题描述 delphi 用控件打开pdf文件无法读取pdf里的表单信息 我用的delphi7 用的是破解版的foxit_ax_pro.ocx文件版本3.0.1.2506,用OpenFile打开一个包含表单的pdf文件,浏览正常,但用代码访问时出错(下面第二行,FNameMI存在): frm:=FoxitReaderSDK1.GetCurrentForm(); ShowMessage(frm.GetFieldByName('FNameMI').Value) ; 变成无法获取表单信息.另外单独打开该

咋识别双层pdf?双层PDF怎样转换单层PDF(代码转换)?

问题描述 咋识别双层pdf?双层PDF怎样转换单层PDF(代码转换)? 咋识别双层pdf?双层PDF怎样转换单层PDF(代码转换)?最好有代码啊!