PyPDF2合并PDF文件出现空白页问题求助
解决PyPDF2合并PDF后出现空白页的问题
嘿Thomas!我仔细看了你的代码和遇到的问题,咱们来一步步拆解这个空白PDF的成因,以及对应的解决办法:
可能的问题点与解决方案
1. Excel字段带多余空格,导致路径无效
你提到路径里出现了多余的空字符,很大概率是Excel表格中Oevelse1、Oevelse2、Oevelse3这几列的单元格内容带有前后空格(比如单元格里是"OevelseA "而不是"OevelseA")。这会让生成的路径变成C:/Users/TH/PDF/OevelseA .pdf——这个文件大概率不存在,PyPDF2在遇到无效路径时不会报错,而是会添加空白页到合并结果里。
解决办法是在拼接路径前,先对字段做去空格处理:
paths = [ (PDF_PATH / row.Oevelse1.strip()).with_suffix('.pdf'), (PDF_PATH / row.Oevelse2.strip()).with_suffix('.pdf'), (PDF_PATH / row.Oevelse3.strip()).with_suffix('.pdf'), ]
2. 未检查目标PDF文件是否存在/非空白
即使路径正确,也有可能目标PDF文件本身就是空白的,或者文件损坏。咱们可以在代码里加个检查,提前发现问题:
for path in paths: # 先检查文件是否存在 if not path.exists(): print(f"⚠️ 警告:未找到文件 -> {path}") continue # 可选:检查文件大小是否为0(空白文件) if path.stat().st_size == 0: print(f"⚠️ 警告:文件为空 -> {path}") continue with path.open('rb') as pdf: pdf_writer.append(pdf)
3. 多循环导致的文件覆盖问题
你的代码里,每遍历Excel的一行就会生成一个名为Uge {next_week} - {year} Merged_doc.pdf的文件。如果Excel里有多行相同year的数据,后面的循环会直接覆盖前面生成的文件。最后你看到的空白PDF,可能只是最后一行数据对应的合并结果(而这一行的三个PDF都无效)。
解决办法是给每个生成的PDF加个唯一标识,比如行索引:
with open(f'Uge {next_week} - {year} - 第{row.Index+1}行 Merged_doc.pdf', 'wb') as output: pdf_writer.write(output)
4. PyPDF2版本兼容性问题
旧版本的PyPDF2在处理某些PDF格式时,可能会出现读取异常导致空白页。建议升级到最新版本:
pip install --upgrade PyPDF2
修改后的完整代码
import datetime import pandas as pd import PyPDF2 as pdf2 from pathlib import Path PDF_PATH = Path('C:/Users/TH/PDF/') EXCEL_FILENAME = 'Resources/liste.xlsx' def main(): today = datetime.date.today() next_week = today.isocalendar()[1] + 1 resources = pd.read_excel(EXCEL_FILENAME, sheet_name='Ark1') for row in resources.itertuples(): year = row.Aargang # 对Excel字段做去空格处理 paths = [ (PDF_PATH / row.Oevelse1.strip()).with_suffix('.pdf'), (PDF_PATH / row.Oevelse2.strip()).with_suffix('.pdf'), (PDF_PATH / row.Oevelse3.strip()).with_suffix('.pdf'), ] pdf_writer = pdf2.PdfFileMerger() for path in paths: # 检查文件是否存在且非空 if not path.exists(): print(f"⚠️ 警告:未找到文件 -> {path}") continue if path.stat().st_size == 0: print(f"⚠️ 警告:文件为空 -> {path}") continue with path.open('rb') as pdf: pdf_writer.append(pdf) # 生成带唯一标识的文件名,避免覆盖 output_filename = f'Uge {next_week} - {year} - 第{row.Index+1}行 Merged_doc.pdf' with open(output_filename, 'wb') as output: pdf_writer.write(output) print(f"✅ 已生成文件:{output_filename}") if __name__ == '__main__': main()
你可以先运行修改后的代码,看看控制台的警告信息,就能快速定位到是哪个PDF文件出了问题啦~
内容的提问来源于stack exchange,提问作者Thomas BP




