📢作者: 小小明-代码实体
📢博客主页:https://blog.csdn.net/as604049322
📢欢迎点赞 👍 收藏 ⭐留言 📝 欢迎讨论!
之前在《PDF批量拆分、合并、书签提取、书签写入小工具》一文中分享了一个GUI小工具,不过合并功能局限在一个文件夹之内。最近看到了陈老师的推文,于是下载了他的《数据分析思维手册》,结果发现pdf文件分散到多个文件夹,而且每个PDF都没有目录:
那么我们完全可以递归合并它们并根据文件夹和文件名生成目录,这样就方便阅读的多。
经过我几番测试,最终编写的完整代码为:
from PIL import Image, ImageFont, ImageDraw
import re
import os
from PyPDF2 import PdfFileReader, PdfFileWriter
class PDFMerge:
"作者:小小明 博客地址:https://xxmdmst.blog.csdn.net/"
@staticmethod
def get_mark_img(text, size=30):
width = len(text) * size
mark = Image.new(mode='RGB', size=(
width, size+20), color=(255, 255, 255))
ImageDraw.Draw(im=mark) .text(xy=(0, 0),
text=text,
fill="black",
font=ImageFont.truetype('msyhbd.ttc', size=size))
mark.save("watermark.pdf", "PDF", resolution=100.0, save_all=True)
return mark
@staticmethod
def windows_files_sort(files):
files.sort(key=lambda s: [(s, int(n))
for s, n in re.findall('(\D+)(\d+)', f'a{s}0')])
def __merge_pdf_in(self, path, parent=None):
files = []
dirs = []
for file in os.listdir(path):
file = os.path.join(path, file)
if os.path.isfile(file):
if file.endswith(".pdf"):
files.append(file)
elif os.path.isdir(file):
dirs.append(file)
PDFMerge.windows_files_sort(files)
PDFMerge.windows_files_sort(dirs)
for pdf_file in files:
pdf_reader = PdfFileReader(pdf_file)
pdf_file = os.path.basename(pdf_file)
pageCount = pdf_reader.getNumPages()
print(pdf_file, pageCount, self.pagenum_total)
for page in pdf_reader.pages:
page.compressContentStreams()
self.pdf_writer.addPage(page)
self.pdf_writer.addBookmark(
pdf_file[:pdf_file.rfind(".")], self.pagenum_total, parent=parent)
self.pagenum_total += pageCount
for path in dirs:
title = os.path.basename(path)
print(title, self.pagenum_total)
PDFMerge.get_mark_img(title)
watermark = PdfFileReader('watermark.pdf').getPage(0)
self.pdf_writer.addPage(watermark)
parent_id = self.pdf_writer.addBookmark(
title, self.pagenum_total, parent=parent)
self.pagenum_total += 1
self.__merge_pdf_in(path, parent=parent_id)
def merge_pdf(self, path, out_name):
self.pagenum_total = 0
self.pdf_writer = PdfFileWriter()
self.__merge_pdf_in(path)
os.remove('watermark.pdf')
print("总页数:", self.pagenum_total)
print("开始写出到文件")
with open(out_name, "wb") as outputfile:
self.pdf_writer.write(outputfile)
print("PDF文件合并完成")
然后我先将文件调整到如下结构:
开始运行代码进行合并:
pdfmerge = PDFMerge()
path = "D:\电子书\《数据分析思维手册和职场真相》"
pdfmerge.merge_pdf(path, "数据分析思维手册和职场真相.pdf")
1数据分析思维手册 0
《数据分析思维手册》目录.pdf 页数: 2 1
1第一章、数据分析方法 3
1.1、数据分析方法.pdf 页数: 7 4
1.2、没有数据分析思路,怎么办.pdf 页数: 6 11
1.3、数据分析如何赋能业务.pdf 页数: 9 17
1.4、如何梳理数据指标体系.pdf 页数: 10 26
1.5、如何做一个优秀的数据分析项目.pdf 页数: 8 36
1.6、数据分析师如何打造数据产品.pdf 页数: 7 44
1.7、如何落地数据分析成果.pdf 页数: 6 51
2第二章、数据运营 57
2.1、如何搭建数据运营体系.pdf 页数: 6 58
2.2、数据分析如何支持运营迭代.pdf 页数: 7 64
2.3、为什么运营不看你的数据分析.pdf 页数: 7 71
2.4、免与运营吵架的基本方法.pdf 页数: 7 78
2.5、如何给出运营建议.pdf 页数: 8 85
3第三章、用户画像 93
3.1、用户画像怎么做.pdf 页数: 6 94
3.2、用户画像的基础操作.pdf 页数: 8 100
3.3、B2B的用户画像.pdf 页数: 9 108
3.4、用户画像报告的撰写.pdf 页数: 6 117
4第四章、数据分析报告 123
4.1、数据报告的正确写法.pdf 页数: 7 124
4.2、数据报告的错误写法.pdf 页数: 7 131
4.3、数据报告如何写“建议”.pdf 页数: 8 138
4.4、为何数据报告没人看.pdf 页数: 7 146
4.5、如何写才有人看.pdf 页数: 7 153
5第五章、实战案例 160
5.1、如何满足运营的需求.pdf 页数: 8 161
5.2、如何满足销售的要求.pdf 页数: 8 169
5.3、如何做“可执行”的分析.pdf 页数: 8 177
5.4、如何开展多维度分析.pdf 页数: 9 185
5.5、如何解决企业复杂问题.pdf 页数: 7 194
2数据分析师的职场真相 201
《数据分析师的职场真相》目录.pdf 页数: 1 202
第一章、求职系列 203
6.1、找数据分析工作难不难.pdf 页数: 5 204
6.2、自我评价怎么写.pdf 页数: 5 209
6.3、工作经验怎么写.pdf 页数: 5 214
6.4、投简历的技巧.pdf 页数: 4 219
第二章、职场真相 223
7.1、数据分析师的绩效如何考核.pdf 页数: 5 224
7.2、数据分析师的晋升之路.pdf 页数: 7 229
7.3、为什么数据分析师比其他岗位幸福.pdf 页数: 6 236
7.4、数据分析师内幕揭秘.pdf 页数: 5 242
7.5、数据分析对企业有什么用.pdf 页数: 5 247
7.6、数据分析、数据挖掘、数据运营有什么区别.pdf 页数: 4 252
总页数: 256
开始写出到文件
PDF文件合并完成
合并结果:
经测试,目录定位的完全准确。