需求

最近有个编辑修改pdf文件的需求:去掉每页等页眉、页脚(里面包含图片),修改后的文件还得保存为pdf。

初步方案

使用python的库:PyPDF2。发现只有功能:简单的读写、拆分、合并等功能。不能去掉文件的部分内容。

解决过程

  1. 先拆分pdf为单页pdf文件;
  2. 将单页pdf转化为png图片;
  3. 编辑切割png图片;
  4. png图片转为pdf文件并合并。

实现过程

import sys
import time
from PyPDF2 import PdfFileReader, PdfFileWriter
from PIL import Image as pilImage
from reportlab.lib.pagesizes import portrait
from reportlab.pdfgen import canvas
from wand.image import Image#=====================
class DelLogo_pdf(object):def __init__(self):#原pdf文件名self.old_pdf_name = "MBC.pdf"#新pdf文件名self.new_pdf_name = "new_noLogo.pdf"#pdf总页数self.pdf_total_pages = 0# 图片后缀self.image_suffix = ".png"#图片精度self.resolution = 180#宽度和高度 1488*2105#距离图片左边界距离x, 距离图片上边界距离y,裁剪框宽度w,裁剪框高度hself.gx = 0self.gy = 120self.gw = 1488self.gh = 1600print("init ok")def run(self):#1原pdf文件,按单页,存单页pdf文件,self.split_pdf(self.old_pdf_name)print("pdf_total_pages:", self.pdf_total_pages)#2单页pdf文件,分别转为单个图片pages = 0while pages < self.pdf_total_pages:pdfFileName = "./tmp/"+str(pages)+".pdf"imageFileName = "./tmp/"+str(pages)+self.image_suffixself.pdf_to_image(pdfFileName, imageFileName, self.resolution)pages += 1#3图片切去logo, 并保存为新图片pages = 0while pages < self.pdf_total_pages:oldImageName = "./tmp/"+str(pages)+self.image_suffixnewImageName = "./tmp/"+str(pages)+"_new"+self.image_suffixself.del_image_logo(oldImageName, newImageName, self.gx,self.gy,self.gw,self.gh)pages += 1#4、单个新图片,转为单页pdfpages = 0while pages < self.pdf_total_pages:pdfName = "./tmp/"+str(pages)+"_new.pdf"imageName = "./tmp/"+str(pages)+"_new"+self.image_suffixself.image_to_pdf(imageName, pdfName)pages += 1#5 合成infnList = []pages = 0while pages < self.pdf_total_pages:pdfName = "./tmp/"+str(pages)+"_new.pdf"infnList.append(pdfName)pages += 1self.merge_pdf(infnList, self.new_pdf_name)print("over.....")return# 1、原pdf文件,按单页,存单页pdf文件,def split_pdf(self, readFileName):print("原pdf文件,按单页,存单页pdf文件")# 获取一个 PdfFileReader 对象pdfReader = PdfFileReader(open(readFileName, 'rb'))# 获取 PDF 的页数pageCount = pdfReader.getNumPages()#self.pdf_total_pages = pageCountself.pdf_total_pages = pageCountprint("原pdf文件总页数:", pageCount)pages = 0while pages < self.pdf_total_pages:# 返回一个 PageObjectpage = pdfReader.getPage(pages)# 获取一个 PdfFileWriter 对象pdfWriter = PdfFileWriter()# 将一个 PageObject 加入到 PdfFileWriter 中pdfWriter.addPage(page)writeFileName = "./tmp/"+str(pages)+".pdf"# 输出到文件中pdfWriter.write(open(writeFileName, 'wb'))pages += 1# 2、单页pdf文件,分别转为单个图片;def pdf_to_image(self, pdfFileName, imageFileName, imgResolution):with Image(filename=pdfFileName, resolution=imgResolution) as img :with img.convert('png') as converted:converted.save(filename=imageFileName)print("pdf_to_image:", pdfFileName, imageFileName)#3  图片切去logo, 并保存为新图片。def del_image_logo(self, oldImageName, newImageName, x, y, w, h):im = pilImage.open(oldImageName)# 图片的宽度和高度img_size = im.sizeprint("图片"+oldImageName+" 图片宽度和高度分别是{}".format(img_size))'''裁剪:传入一个元组作为参数元组里的元素分别是:(距离图片左边界距离x, 距离图片上边界距离y,裁剪框宽度w,裁剪框高度h)'''region = im.crop((x, y, x+w, y+h))region.save(newImageName)#==== 图片背景色设为白色im = pilImage.open(newImageName)x,y = im.sizep = pilImage.new('RGBA', im.size, (255,255,255))p.paste(im, (0, 0, x, y), im)p.save(newImageName)#4、单个新图片,转为单页pdf。def image_to_pdf(self, imageName, pdfName):print("image_to_pdf:", imageName, pdfName)(maxw, maxh) = pilImage.open(imageName).sizec = canvas.Canvas(pdfName, pagesize=portrait((maxw, maxh)))c.drawImage(imageName, 0, 0, maxw, maxh)c.showPage()c.save()#5、合成所有单页pdf,转为完整新pdf文件# infnList:单个pdf文件名数组。# outfn: 新pdf文件def merge_pdf(self, infnList, outfn):print("合成pdf:", infnList, outfn)pdf_output = PdfFileWriter()for infn in infnList:pdf_input = PdfFileReader(open(infn, 'rb'))# 获取 pdf 共用多少页page_count = pdf_input.getNumPages()#print(page_count)for i in range(page_count):pdf_output.addPage(pdf_input.getPage(i))pdf_output.write(open(outfn, 'wb'))if __name__ == '__main__':localtime = time.asctime( time.localtime(time.time()) )print("开始时间为 :", localtime)delLogo_pdf = DelLogo_pdf()delLogo_pdf.run()localtime = time.asctime( time.localtime(time.time()) )print("结束时间为 :", localtime)复制代码

注释:

  1. 效率问题,pdf与png之间转化时间较长(1-2s)。

作者:timix
链接:https://juejin.im/post/5c1fa58f5188257d9937609e
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

python修改pdf文件相关推荐

  1. python修改pdf文件名称_使用Python重命名pdf文件目录几乎可以工作

    我一直试图添加"Q3"到89个pdf文件的开头在一个文件夹.我已经设法得到了解决方案的结果HERE 这是有效的,但只适用于大约10-15个文件,然后停止出现各种错误,而且没有定义顺 ...

  2. 如何用python修改pdf内容_如何利用python将pdf文件转化为txt文件?

    https://www.wukong.com/answer/6579491774144708872/?iid=15906422033&app=news_article&share_an ...

  3. Python实现PDF文件转图片(PNG,JPEG等格式)

    介绍 这篇博客目的主要是使用Python实现PDF文件转换成图片,以方便下游任务的进行. 开发包 fitz PyMuPDF 在控制台依次执行以下命令: pip install fitz pip ins ...

  4. 最简单的免费修改PDF文件方法

    2019独角兽企业重金招聘Python工程师标准>>> 对于修改PDF文件,如果到网上搜索的话,大多都是要收费的,这里给大家分享一个免费修改PDF文件的方式. 需要用的工具:Chro ...

  5. 如何修改pdf文件的背景色

    PDF文件在生活中很常见,我们电子书就是PDF格式的,在阅读电子书的时候,如果你不喜欢它的背景色,想修改它的背景色,我们改怎么做! 小编知道一个在线修改PDF文件的网址,这里分享给大家PDF背景颜色h ...

  6. Python绘制PDF文件~超简单的小程序

    Python绘制PDF文件 项目简介 这次项目很简单,本次项目课,代码不超过40行,主要是使用 urllib和reportlab模块,来生成一个pdf文件. reportlab官方文档 http:// ...

  7. gnuradio上怎么使用python文件_使用Python从PDF文件中提取数据

    前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...

  8. pdf exe如何提取pdf文件_python应用:如何用python提取pdf文件中的文字

    从pdf中提取文字,相信很多人都干过这事,怎么在python中实现呢,今天带大家看看. 第一步导入库 import PyPDF2 第二步导入pdf文件 pdf_file =open('dataset/ ...

  9. python数据生成pdf,Python生成pdf文件的方法

    摘要:这篇Python开发技术栏目下的"Python生成pdf文件的方法",介绍的技术点是"python生成pdf文件.python生成pdf.生成pdf文件.Pytho ...

  10. python修改xml标签的值_对python修改xml文件的节点值方法详解

    这是我的xml文件结构 <?xml version='1.0' encoding='utf-8'?> JPEGImages train_2018-05-08_1000.jpg D:\all ...

最新文章

  1. SpringBoot整合Spring Security——第三章异常处理
  2. Developer Express 中Gridcontrol获取选中行单元格的值
  3. html日历显示不完整,求html代码,显示日历和时间的代码
  4. Thymeleaf 学习笔记 (4)~~~~
  5. OpenStack tokens id获取测试
  6. 抽丝剥茧!Source Generators原理讲解
  7. fso封装类可以用仿dos命令操作文件
  8. 【NLP】毕设学习笔记(八)“前馈 + 反馈” = 循环神经网络RNN
  9. ASP禁止刷新当前页
  10. vs中无法加入断点进行调试的解决方案
  11. pyqt5 qwidget有父类窗口如何设置模态_实战PyQt5: 024-Qt Designer进阶一
  12. 如果无法使用软件打开.mmap文件,解决办法
  13. 从VBA到VSTO的一些想法
  14. 嵌入式linux ucgui,嵌入式开发-uCGUI中文手册-uCGUI 简介.pdf
  15. 复变函数总结一:复变函数
  16. 一文带你由浅入深Netty异步非阻塞世界(持续更新~~~)
  17. 关于cdd文件的配置
  18. 360压缩加密压缩文件
  19. 任务管理器 中mysqld.exe 所占内存过高
  20. 飞行棋游戏代码(C#)

热门文章

  1. 烽火mysql数据库安装_sql/mysql3.md · zack烽火/knowledge - Gitee.com
  2. debian笔记本电源管理
  3. PHP连接MySQL-踩坑总结
  4. 思科 计算机网络 期末考试答案
  5. 多目标跟踪之数据关联算法——匈牙利算法
  6. 南京大学俞扬博士:强化学习前沿(下)
  7. 瑞星杀毒软件网络版2012支持Web日志访问
  8. GIN日志和日志格式
  9. 小鸡模拟器android,安卓小鸡模拟器运行总结~
  10. 手把手教你搞懂麦克风的技术指标