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

目录
  • 需求
  • 需求解析
  • 代码实现

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

需求

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

选择源 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)

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

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

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拆分内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python实现简单拆分PDF文件的方法

    本文实例讲述了Python实现简单拆分PDF文件的方法.分享给大家供大家参考.具体如下: 依赖pyPdf处理PDF文件 切分pdf文件 使用方法: 1)将要切分的文件放在input_dir目录下 2)在configure.txt文件中设置要切分的份数(如要切分4份,则设置part_num=4) 3)执行程序 4)切分后的文件保存在output_dir目录下 5)运行日志写在pp_log.txt中 P.S. 本程序可以批量切割多个pdf文件 from pyPdf import PdfFileWri

  • Python利用PyPDF2快速拆分PDF文档

    目录 安装PyPDF2模块 创建文件,准备PDF文档 万事俱备,准备开拆 文档的拆分思路 python拆分计算公式: 具体怎么拆? 完整拆分程序: 列表拆分法实现拆分PDF 写在最后 "人生苦短,快学Python",因为这句口号,我也加入了学习Python的浩浩大军,但由于Python真的是可以做的事情太多了,一时迷了眼,不知道自己应该去专攻哪个方向. 经过多方向试探,我还是选择了广而不深的web开发,Python的web开发自然离不开大名鼎鼎的Django,有一次突发奇想,下载了Dj

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

    目录 需求 需求解析 代码实现 今天我们继续分享真实的自动化办公案例,希望各位 Python 爱好者能够从中得到些许启发,在自己的工作生活中更多的应用 Python,使得工作事半功倍! 需求 需要从 PDF 中取出几页并将其保存为新的 PDF,为了后期使用方便,这个工具需要做成傻瓜式的带有 GUI 页面的形式 选择源 pdf 文件,再指定下生成的新的 pdf 文件名称及保存位置,和需要拆分的 page 信息,就可以得到新的 pdf 文件了 需求解析 对于 Python GUI,我们有太多种选择了

  • Python自动化办公实战案例详解(Word、Excel、Pdf、Email邮件)

    目录 背景 实现过程 1)替换Word模板生成对应邀请函 2)将Word邀请函转化为Pdf格式 4)自动发送邮件 5)完整代码 总结 背景 想象一下,现在你有一份Word邀请函模板,然后你有一份客户列表,上面有客户的姓名.联系方式.邮箱等基本信息,然后你的老板现在需要替换邀请函模板中的姓名,然后将Word邀请函模板生成Pdf格式,之后编辑统一的邀请话术(邮件正文),再依次发送邀请函附件到客户邮箱,你会怎么做? 正常情况下,我们肯定是复制粘贴Excel表格中的客户姓名,之后挨个Word文档进行替换

  • Python自动化办公之Word转PDF的实现

    目录 pdf 工具包 - pdfkit html 转 pdf 网址 转 pdf 字符串生成pdf 结合 pydocx 将 word 转 html 再转 pdf 该章节我们将要学习如何将 word 文件转为 PDF文件,其实网上有很多种生成 PDF 的教程,不过绝大多数都是以 windows 为主的,并且兼容有很多的问题.windows.mac.linux 同时兼容的情况比较少,所以今天的章节我们就来学习一下如何在 windows.mac.linux 三种系统中都可以生成 PDF 的解决方案. p

  • Python自动化办公之Excel拆分与自动发邮件

    目录 需求 需求解析 代码实现 需求 需要向大约 500 名用户发送带有 Excel 附件的电子邮件,同时必须按用户从主 Excel 文件中拆分数据以创建他们自己的特定文件,然后将该文件通过电子邮件发送给正确的用户 需求解析 大致的流程就是上图,先拆分 Excel 数据,提取出对应的邮件地址和用户的数据信息,再自动添加到邮件的附件当中 代码实现 首先我们先来看下我们手中 Excel 的数据形式是怎么样的 import datetime import os import shutil from p

  • Python自动化办公之图片转PDF的实现

    安装的方式很常规,直接使用pip安装就行了. pip install fpdf 将需要使用的三方模块导入进来 from fpdf import FPDF # PDF文档对象操作库 import os # 文件路径操作库 初始化PDF文档对象 PDF = FPDF() 关闭自动分页 PDF.set_auto_page_break(0) 设置需要转换的批量图片路径 path = r'C:/imgs' 遍历图片到数组 images = [i for i in os.listdir(path)] 设置多

  • Python自动化办公之群发邮件案例详解

    目录 背景 实现过程 总结 背景 想象一下,现在你有一份Word邀请函模板,然后你有一份客户列表,上面有客户的姓名.联系方式.邮箱等基本信息,然后你的老板现在需要替换邀请函模板中的姓名,然后将Word邀请函模板生成Pdf格式,之后编辑统一的邀请话术(邮件正文),再依次发送邀请函附件到客户邮箱,你会怎么做? 正常情况下,我们肯定是复制粘贴Excel表格中的客户姓名,之后挨个Word文档进行替换,之后将Word转Pdf格式,然后复制Excel表格中的邮箱进行发送编辑好的邮件正常,之后附上邀请函附件,

  • 五个方便好用的Python自动化办公脚本的实现

    目录 1.自动化阅读网页新闻 2.自动生成素描草图 3.自动发送多封邮件 4.自动化数据探索 5.自动桌面提示 小结 相比大家都听过自动化生产线.自动化办公等词汇,在没有人工干预的情况下,机器可以自己完成各项任务,这大大提升了工作效率. 编程世界里有各种各样的自动化脚本,来完成不同的任务. 尤其Python非常适合编写自动化脚本,因为它语法简洁易懂,而且有丰富的第三方工具库. 这次我们使用Python来实现几个自动化场景,或许可以用到你的工作中. 1.自动化阅读网页新闻 这个脚本能够实现从网页中

  • python自动化办公操作PPT的实现

    1.python-pptx模块简介 使用python操作PPT,需要使用的模块就是python-pptx,下面来对该模块做一个简单的介绍.这里提前做一个说明:python操作PPT,最好是我们提前设计好自己的一套样式,然后利用进行python进行内容的获取和填充(最主要的功能!),最好是不用使用python代码操作PPT的格式,格式的修改肯定不如我们直接在PPT中修改方便. 可以创建.修改PPT(.pptx)文件 需要单独安装,不包含在Python标准模块里 python-pptx官网介绍:ht

  • Python自动化办公之Word文件内容的读取

    目录 前言 利用 python 批量读取文件 word利器之python-docx python-docx 安装 python-docx 之 Document python-docx 之段落内容读取 python-docx 之表格内容读取 前言 前面几个章节我们学习了对于普通文件的操作,比如说文件的创建.复制粘贴.裁剪粘贴.文件名的重命名.删除等等.另外还学习了一些基本练习,如何查找文件.如何按照内容查找文件等等. 在本章节及后续,将开始学习一些特殊文件的自动化相关操作.如 word.excel

  • python 自动化办公之批量修改文件名实操

    目录 1. 程序背景 2. 程序要求 3. 解决思路 4. 完整代码 5. 运行结果 6. 总结 1. 程序背景 之前做文件批量移动的时候不小心多加了一个pdf后缀,但问题不大,几行代码就可以搞定~ 2. 程序要求 将以下目录中文件夹中的有问题的文件全部重命名为单个.pdf结尾的文件 3. 解决思路 需要用到 os.re 和 shutil 三个库,均为系统自带,无需安装 使用 os 库得到年份的文件夹名,以及年份文件夹中的文件名 使用正则表达式 re 将“.pdf.pdf”全部替换为“.pdf”

随机推荐