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
相关产品推荐
相关产品推荐

