Python实现pdf合并功能,并打包生成应用[无Python环境下使用]

功能实现源码以及打包后应用文件

一、应用功能描述

应用包含:
	有一个pdf文件夹,将需要合并的pdf放入该文件夹中,依序读取合并
	有一个exe可执行文件,双击即可执行并根据指令实现pdf合并功能

二、Python代码

# Author : zxy
# Date : 2022/5/24 23:27
# Desc : 开发合并PDF功能,并打包成可执行exe文件

import os
# 使用os模块的walk函数,搜索出指定目录下的全部PDF文件
from PyPDF2 import PdfFileReader, PdfFileWriter


# 获取同一目录下的所有PDF文件的绝对路径
def getFileName(filedir):

    file_list = [os.path.join(root, filespath) \
                 for root, dirs, files in os.walk(filedir) \
                 for filespath in files \
                 if str(filespath).endswith('pdf')
                 ]
    return file_list if file_list else []

# 合并同一目录下的所有PDF文件
def MergePDF(filepath, outfile):

    output = PdfFileWriter()
    outputPages = 0
    pdf_fileName = getFileName(filepath)

    if pdf_fileName:
        for pdf_file in pdf_fileName:
            print("路径:%s"%pdf_file)

            # 读取源PDF文件
            input = PdfFileReader(open(pdf_file, "rb"))

            # 获得源PDF文件中页面总数
            pageCount = input.getNumPages()
            outputPages += pageCount
            print("页数:%d"%pageCount)

            # 分别将page添加到输出output中
            for iPage in range(pageCount):
                output.addPage(input.getPage(iPage))

        print("合并后的总页数:%d"%outputPages)
        # 写入到目标PDF文件
        outputStream = open(os.path.join(filepath, outfile), "wb")
        output.write(outputStream)
        outputStream.close()
        print("PDF文件合并完成!")

    else:
        print("没有可以合并的PDF文件!")

# 主函数
if __name__ == '__main__':
    while True:
        print('亲爱的女士\先生,很高兴为你服务!!!')
        outfile1 = input('请先输入合并后的文件名:')
        outfile = outfile1+'.pdf'
        file_dir = r'pdf'
        MergePDF(file_dir, outfile)
        answer = input('是否继续合并?y/n')
        if answer == 'y':
            continue
        else:
         break

三、运行结果测试

亲爱的女士\先生,很高兴为你服务!!!
请先输入合并后的文件名:3
路径:pdf\1.pdf
页数:3
路径:pdf\2.pdf
页数:4
合并后的总页数:7
PDF文件合并完成!
是否继续合并?y/ny
亲爱的女士\先生,很高兴为你服务!!!
请先输入合并后的文件名:4
路径:pdf\1.pdf
页数:3
路径:pdf\2.pdf
页数:4
路径:pdf\3.pdf
页数:7
合并后的总页数:14
PDF文件合并完成!
是否继续合并?y/nn

四、打包

初次使用打包功能的时候,需要先下载pyinstaller包

1.将主函数生成对应的spec文件

pyi-makespec .\mergepdf.py

2.修改spec文件
这里主要修改Analysis部分的pathex为项目路径,datas为打包项目中的文件夹修改EXE部分的name为exe文件的名称,icon为exe可执行文件指定的图标

图片制作ico

......
a = Analysis(
    ['mergepdf.py'],
    pathex=['E:\\BigData\\date\\PyCharm\\PythonStudy\\action\\pdf'],
    binaries=[],
    datas=[('pdf','pdf')],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
    noarchive=False,
)

......
exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='Pdf合并',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=True,
    disable_windowed_traceback=False,
    argv_emulation=False,
    target_arch=None,
    codesign_identity=None,
    entitlements_file=None,
    icon='pdf.ico',
)
......

3.执行打包spec文件

pyinstaller .\mergepdf.spec

五、使用

1.目录一览

pdf文件夹为pdf文件放置目录Pdf合并.exe为执行合并的应用程序

PDF库支持行级别 python python pdf包_pycharm

2.功能测试

首先需要你输入合并文件后,新文件的名称合并完成后会跟你确认是否继续合并,y是继续合并,n是退出

这里设计询问你是否继续合并是因为,方便你需要合并不同的文件,不需要关闭窗口。只需要将pdf目录下的文件删除并重新上传,然后你在应用窗口继续合并即可

PDF库支持行级别 python python pdf包_PDF库支持行级别 python_02

3.测试结果

因为我合并了两次,第一次是按照顺序将1->2->3,这三个合并到合并一次.pdf中。第二次是将1->2->3->合并一次,这四个文件合并到合并两次.pdf文件中

PDF库支持行级别 python python pdf包_PDF库支持行级别 python_03

六、问题解决

1.问题

Fatal Python Error:initsencoding: unable to load the file system codecModuleNotFoundError: No module named encodings

PDF库支持行级别 python python pdf包_Python_04

2.解决

这里出现上午问题的主要原因是我的python环境是3.7,使用python3.7打包的应用可能会有问题,报出No module named encodings问题。所以先打开电脑的设置->应用->应用和功能,在应用与功能中找到Python 3.7Python Launcher这两个应用程序并卸载。然后下载新的Python3.8的安装包,重新安装,安装完成后打包即可。已经测试通过
下载路径:官网下载路径:资源