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可执行文件指定的图标
......
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为执行合并的应用程序
2.功能测试
首先需要你输入合并文件后,新文件的名称
合并完成后会跟你确认是否继续合并,y是继续合并,n是退出
这里设计询问你是否继续合并是因为,方便你需要合并不同的文件,不需要关闭窗口。只需要将pdf目录下的文件删除并重新上传,然后你在应用窗口继续合并即可
3.测试结果
因为我合并了两次,第一次是按照顺序将1->2->3,这三个合并到合并一次.pdf中。第二次是将1->2->3->合并一次,这四个文件合并到合并两次.pdf文件中
六、问题解决
1.问题
Fatal Python Error:initsencoding: unable to load the file system codec
ModuleNotFoundError: No module named encodings
2.解决
这里出现上午问题的主要原因是我的python环境是3.7,使用python3.7打包的应用可能会有问题,报出No module named encodings
问题。所以先打开电脑的设置->应用->应用和功能
,在应用与功能中找到Python 3.7
和Python Launcher
这两个应用程序并卸载。然后下载新的Python3.8的安装包,重新安装,安装完成后打包即可。已经测试通过
下载路径:官网下载路径:资源