You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PDF拆分Python代码执行后无输出文件问题求助

问题:PDF拆分代码无输出文件

我最近在修改一段Python代码,用来按需求拆分PDF并输出到指定文件夹。原本代码能读取PDF并统计处理页数,但输出路径里没生成目标文件;优化PDF读取能力后,干脆连任何输出都没了。

原代码

import re
import time
import os
from PyPDF2 import PdfReader, PdfWriter
import fitz
import parameters

input_dir = parameters.inputs_foldername+'\Certificates'
try:
    os.mkdir(input_dir)
except:
    pass

output_dir = 'Outputs_'+parameters.batch_name+'\Split Certificates'
isExist = os.path.exists(output_dir)
if not isExist:
    os.makedirs(output_dir)

for path in os.listdir(input_dir):
    full_path = os.path.join(input_dir, path)

    t0 = time.time()

    i = 0
    new = True
    pdf_writer = None  # Initialize pdf_writer
    parid = None  # Initialize parid

    with fitz.open(full_path) as doc:
        pdf = PdfReader(full_path)
        for i in range(len(pdf.pages)):
            text = doc[i].get_text()

            if ("Page 1 of" not in text) and (new == True):
                try:
                    tmp = re.search(r"(?<=\*  \*  \*\n)\d{7}", text)
                    parid = tmp.group()
                except AttributeError:
                    print(f"Pattern not found in text: {text}")
                    continue
                if pdf_writer is not None:
                    with open(output_dir+'/'+str(parid)+'.pdf', "wb") as out:
                        pdf_writer.write(out)
                pdf_writer = PdfWriter()
                pdf_writer.add_page(pdf.pages[i])
                i += 1
                new = False
            elif ("Page 1 of" not in text) and (new == False):
                pdf_writer.add_page(pdf.pages[i])
            elif ("Page 1 of" in text) and (new == False):
                with open(output_dir+'/'+str(parid)+'.pdf', "wb") as out:
                    pdf_writer.write(out)
                new = True

    # Save the last pdf_writer after the loop
    if pdf_writer is not None:
        with open(output_dir+'/'+str(parid)+'.pdf', "wb") as out:
            pdf_writer.write(out)

    t1 = time.time()
    print(str(i+1)+" pages processed in " + str(int(t1-t0)) + " seconds.")

问题排查与修复方案

1. 路径拼接错误

手动用+拼接路径时,Windows下的反斜杠\会被Python转义(比如\C可能被解析为无效转义字符),导致实际路径不合法。改用os.path.join()统一处理路径,兼容所有操作系统:

input_dir = os.path.join(parameters.inputs_foldername, 'Certificates')
output_dir = os.path.join(f'Outputs_{parameters.batch_name}', 'Split Certificates')

2. 循环变量冲突

for i in range(len(pdf.pages))循环中,手动执行i +=1会导致循环跳过页面,逻辑混乱。直接删除这行代码,让循环自动遍历所有页面。

3. 文件写入路径不规范

输出文件路径用/在Windows下可能无法识别,同样用os.path.join()生成合法路径:

output_file = os.path.join(output_dir, f"{parid}.pdf")
with open(output_file, "wb") as out:
    pdf_writer.write(out)

4. 异常处理不精准

原代码except:会捕获所有异常,包括路径创建的非预期错误,改为只捕获FileExistsError,保留其他异常的报错提示,方便排查问题。

5. 边界情况加固

确保parid不为空时再写入文件,避免生成无效文件名的空文件;同时跳过输入目录中的非文件项,避免读取文件夹报错。

修复后的代码

import re
import time
import os
from PyPDF2 import PdfReader, PdfWriter
import fitz
import parameters

# 修正路径拼接方式
input_dir = os.path.join(parameters.inputs_foldername, 'Certificates')
try:
    os.mkdir(input_dir)
except FileExistsError:
    pass  # 仅忽略文件夹已存在的错误,其他异常仍抛出

# 修正输出路径拼接
output_dir = os.path.join(f'Outputs_{parameters.batch_name}', 'Split Certificates')
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

for path in os.listdir(input_dir):
    full_path = os.path.join(input_dir, path)
    if not os.path.isfile(full_path):
        continue  # 跳过非文件项

    t0 = time.time()

    new = True
    pdf_writer = None
    parid = None

    # 统一用fitz读取文本,PyPDF2处理页面拆分
    with fitz.open(full_path) as doc:
        pdf = PdfReader(full_path)
        page_count = len(pdf.pages)
        for page_idx in range(page_count):
            text = doc[page_idx].get_text()

            if "Page 1 of" not in text and new:
                try:
                    tmp = re.search(r"(?<=\*  \*  \*\n)\d{7}", text)
                    parid = tmp.group()
                except AttributeError:
                    print(f"Pattern not found in page {page_idx+1}: {text[:100]}...")
                    continue
                # 保存上一个文档(如果存在)
                if pdf_writer is not None and parid is not None:
                    output_file = os.path.join(output_dir, f"{parid}.pdf")
                    with open(output_file, "wb") as out:
                        pdf_writer.write(out)
                # 初始化新文档
                pdf_writer = PdfWriter()
                pdf_writer.add_page(pdf.pages[page_idx])
                new = False
            elif "Page 1 of" not in text and not new:
                if pdf_writer is not None:
                    pdf_writer.add_page(pdf.pages[page_idx])
            elif "Page 1 of" in text and not new:
                if pdf_writer is not None and parid is not None:
                    output_file = os.path.join(output_dir, f"{parid}.pdf")
                    with open(output_file, "wb") as out:
                        pdf_writer.write(out)
                new = True

        # 保存最后一个文档
        if pdf_writer is not None and parid is not None:
            output_file = os.path.join(output_dir, f"{parid}.pdf")
            with open(output_file, "wb") as out:
                pdf_writer.write(out)

    t1 = time.time()
    print(f"{page_count} pages processed in {int(t1-t0)} seconds.")

内容的提问来源于stack exchange,提问作者Avery Delancy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:42:52