最近需要合并大量的pdf, 找了幾個工具,要么收費,要么不好用,然后就自己寫了簡單功能的小工具.
特點就是把當前目錄及子目錄下的所有pdf文件合并成一個merged.pdf (比如你直接放在D盤根目錄會把你D盤里面的所有pdf全部合并成一個, 會很占內存和時間)
除了方便打印我也不知道有什么其他的作用, 反正我就是拿來打印的
已知BUG
- 某些特殊編碼的pdf合并會失敗(沒找到解決辦法), 而且也無法確定是哪一個文件---整個文件保存失敗也就是完全無法合并
- 某些pdf會因為不知道什么原因無法讀取xref,無法打開 --- 解決辦法 : 使用瀏覽器或者其他什么可以打開pdf的程序確定程序可以打開, 然后點擊打印, 通過虛擬打印機再保存出來, 就可以修復了.
如果你嫌棄他會輸出很多警告信息的話可以去pypdf4包的源碼中把那些警告輸出注釋掉, 具體方法就不講了, 如果有需要可以私信我
提供天翼網(wǎng)盤連接:https://cloud.189.cn/t/A73QzqmQRjMz (訪問碼:kpo0)
寫的很簡單, 高手勿噴
為大佬提供源碼:
import re
from PyPDF4.pdf import PdfFileReader as pr, PdfFileWriter as pw
def MergePDF(dir_path):
pdf_files = list()
merged_file = pw()
for path, _, files in os.walk(dir_path):
pdf_files.extend([os.path.join(path, f)
for f in files if f.lower().endswith('.pdf')]) # 遍歷當前文件夾下所有pdf文件并組合成相對路徑
pdf_files.sort(key=lambda i: int(re.findall(r'(\d+).*?', i)
[0]) if re.findall(r'(\d+).*?', i) else -1) # 按照路徑排序(沒有數(shù)字的在前面, 有數(shù)字的從小到大排序)
for pdf_file in pdf_files:
print(pdf_file)
try:
pdf = pr(open(pdf_file, "rb"))
except:
print(f'{pdf_file}無法解析')
continue
if pdf.isEncrypted:
print(f'{pdf_file} 是加密文件')
res = input('輸入密碼(回車鍵跳過)')
while res:
try:
pdf.decrypt(res) # pdf 解密
break
except:
print('密碼錯誤')
res = input('輸入密碼(回車鍵跳過)')
if not res:
continue
pageCount = pdf.getNumPages()
# 分別將page添加到輸出output中
for iPage in range(pageCount):
merged_file.addPage(pdf.getPage(iPage))
with open('merged.pdf', "wb") as outputfile:
# 注意這里的寫法和正常的上下文文件寫入是相反的
merged_file.write(outputfile)
print('Done')
input()
if __name__ == '__main__':
# 設置存放多個pdf文件的文件夾
dir_path = r'.'
MergePDF(dir_path)