You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PyPDF2合并PDF文件出现空白页问题求助

解决PyPDF2合并PDF后出现空白页的问题

嘿Thomas!我仔细看了你的代码和遇到的问题,咱们来一步步拆解这个空白PDF的成因,以及对应的解决办法:

可能的问题点与解决方案

1. Excel字段带多余空格,导致路径无效

你提到路径里出现了多余的空字符,很大概率是Excel表格中Oevelse1Oevelse2Oevelse3这几列的单元格内容带有前后空格(比如单元格里是"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

火山引擎 最新活动