大蟒蛇python教程共享Python自动化办公之编写PDF拆分工具

今天我们继续分享真实的自动化办公案例,希望各位 python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 python,使得工作事半功倍!

需求

需要从 pdf 中取出几页并将其保存为新的 pdf,为了后期使用方便,这个工具需要做成傻瓜式的带有 gui 页面的形式

Python自动化办公之编写PDF拆分工具

选择源 pdf 文件,再指定下生成的新的 pdf 文件名称及保存位置,和需要拆分的 page 信息,就可以得到新的 pdf 文件了

需求解析

对于 python gui,我们有太多种选择了,下面我们先来横向的简单对比下

从高层次上看,大的 gui 工具有:

  • qt
  • wxwindows
  • tkinter
  • customer libraries(kivy,toga等)
  • web相关(html,flask等)

不过今天,我们选择的工具是 appjar,这是一个由一位从事教育工作的大神发明的,所以它可以提供一个更加简单的 gui 创建过程,而且是完全基于 tkinter 的,python 默认支持

代码实现

首先为了实现 pdf 操作,我这里选择了 pypdf2 库

我们先硬编码一个输入输出的示例

from pypdf2 import pdffilewriter, pdffilereader    infile = "input.pdf"  outfile = "output.pdf"    page_range = "1-2,6"  

接下来我们实例化 pdffilewriter 和 pdffilereader 对象,并创建实际的 output.pdf 文件

output = pdffilewriter()  input_pdf = pdffilereader(open(infile, "rb"))  output_file = open(outfile, "wb")  

下面一个比较复杂的点就是需要拆分 pdf,提取页面并保存在列表中

page_ranges = (x.split("-") for x in page_range.split(","))  range_list = [i for r in page_ranges for i in range(int(r[0]), int(r[-1]) + 1)]  

最后就是从原始文件中拷贝内容到新的文件

for p in range_list:      output.addpage(input_pdf.getpage(p - 1))  output.write(output_file)  

下面来构建 gui 界面

对于这个拆分 pdf 的小工具,需要具有如下功能:

  • 可以通过标准文件浏览器选择 pdf 文件
  • 可以选择输出文件的位置及文件名称
  • 可以自定义提取哪些页面
  • 有一些错误检查

通过 pip 安装好 appjar 后,我们就可以编码了

from appjar import gui  from pypdf2 import pdffilewriter, pdffilereader  from pathlib import path  

创建 gui 窗口

app = gui("pdf splitter", usettk=true)  app.setttktheme("default")  app.setsize(500, 200)  

这里我使用了默认主题,当然也可以切换各种各样的主题模式

Python自动化办公之编写PDF拆分工具

下面是添加标签和数据输入组件

app.addlabel("choose source pdf file")  app.addfileentry("input_file")    app.addlabel("select output directory")  app.adddirectoryentry("output_directory")    app.addlabel("output file name")  app.addentry("output_name")    app.addlabel("page ranges: 1,3,4-10")  app.addentry("page_ranges")  

接下来添加按钮,“处理”和“退出”,按下按钮,调用如下函数

app.addbuttons(["process", "quit"], press)  

最后就是运行这个 app 啦

# start the gui  app.go()  

这样我们就完成了 gui 的搭建,下面编写内部处理逻辑。程序读取任何输入,判断是否为 pdf,并拆分

def press(button):      if button == "process":          src_file = app.getentry("input_file")          dest_dir = app.getentry("output_directory")          page_range = app.getentry("page_ranges")          out_file = app.getentry("output_name")          errors, error_msg = validate_inputs(src_file, dest_dir, page_range, out_file)          if errors:              app.errorbox("error", "n".join(error_msg), parent=none)          else:              split_pages(src_file, page_range, path(dest_dir, out_file))      else:          app.stop()  

如果单击 “处理(process)”按钮,则调用 app.getentry() 检索输入值,每个值都会被存储,然后通过调用 validate_inputs() 进行验证

来看看 validate_inputs 函数

def validate_inputs(input_file, output_dir, range, file_name):      errors = false      error_msgs = []        # make sure a pdf is selected      if path(input_file).suffix.upper() != ".pdf":          errors = true          error_msgs.append("please select a pdf input file")        # make sure a range is selected      if len(range) < 1:          errors = true          error_msgs.append("please enter a valid page range")        # check for a valid directory      if not(path(output_dir)).exists():          errors = true          error_msgs.append("please select a valid output directory")        # check for a file name      if len(file_name) < 1:          errors = true          error_msgs.append("please enter a file name")        return(errors, error_msgs)  

这个函数就是执行一些检查来确保输入有数据并且有效

在收集验证了所有数据后,就可以调用 split 函数来处理文件了

def split_pages(input_file, page_range, out_file):      output = pdffilewriter()      input_pdf = pdffilereader(open(input_file, "rb"))      output_file = open(out_file, "wb")        page_ranges = (x.split("-") for x in page_range.split(","))      range_list = [i for r in page_ranges for i in range(int(r[0]), int(r[-1]) + 1)]        for p in range_list:          # need to subtract 1 because pages are 0 indexed          try:              output.addpage(input_pdf.getpage(p - 1))          except indexerror:              # alert the user and stop adding pages              app.infobox("info", "range exceeded number of pages in input.nfile will still be saved.")              break      output.write(output_file)        if(app.questionbox("file save", "output pdf saved. do you want to quit?")):          app.stop()  

好了,这样我们就完成了一个简易的 gui 拆分 pdf 文件的工具喽

到此这篇关于python自动化办公之编写pdf拆分工具的文章就介绍到这了,更多相关python pdf拆分内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多python教程分享Python自动化办公之编写PDF拆分工具,都可以关注python教程分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/pythontutorial/1067916.html

(0)
上一篇 2022年3月27日
下一篇 2022年3月27日

精彩推荐