pdf文件合并并生成新的目录

import pikepdf
import os
from datetime import datetime

def merge_pdfs_with_outline():
    # 获取当前目录下所有的PDF文件
    pdf_files = [f for f in os.listdir('.') if f.endswith('.pdf')]
    
    if len(pdf_files) < 2:
        print("当前目录下PDF文件少于2个!")
        return
    
    try:
        # 按文件名排序
        pdf_files.sort()
        
        # 生成输出文件名
        output_name = 'merged_output.pdf'
        
        # 创建一个新的PDF文件
        merged_pdf = pikepdf.Pdf.new()
        
        # 创建目录结构
        outline = merged_pdf.open_outline()
        
        # 记录当前页码
        current_page = 0
        
        # 合并选中的文件
        for pdf_file in pdf_files:
            print(f"正在处理: {pdf_file}")
            pdf = pikepdf.Pdf.open(pdf_file) 
            
            # 先添加页面
            merged_pdf.pages.extend(pdf.pages)
            
            # 添加文件到目录
            if current_page < len(merged_pdf.pages) and current_page!=0:
                outline.add(
                    title='Book'+os.path.splitext(pdf_file)[0].lstrip('0'),
                    destination=merged_pdf.pages[current_page].index
                )
            
            # 如果原PDF有目录,也添加其目录项
            if '/Outlines' in pdf.Root:
                try:
                    source_outline = pdf.open_outline()
                    for item in source_outline.root:
                         # 获取目标页码
                        dest_page = item.destination
                        if isinstance(dest_page, pikepdf.Array):
                            raw_page = dest_page[0]
                            page = pikepdf.Page(raw_page) 
                            page_index=int(page.label)
                        elif isinstance(dest_page, int):
                           page_index=dest_page
                        else:
                           page_index = 0
                            
                        if current_page + page_index < len(merged_pdf.pages):
                            outline.add(
                                title=item.title,
                                destination=merged_pdf.pages[current_page + page_index-1].index
                            )
                except Exception as e:
                    print(f"处理文件 {pdf_file} 的目录时出错:{str(e)}")
            
            # 更新页码
            current_page += len(pdf.pages)
        
        
        # 保存合并后的文件
        merged_pdf.save(output_name)
        
        print(f"\nPDF文件合并成功!")
        print(f"输出文件:{output_name}")
        print(f"合并的文件:{', '.join(pdf_files)}")
        
    except Exception as e:
        print(f"合并过程中出现错误:{str(e)}")

if __name__ == '__main__':
    merge_pdfs_with_outline()

 

以上代码使用pikepdf实现若干个pdf文件按照名称排序生成新的pdf文件并生成新的目录结构

posted @ 2025-03-28 17:01  战时事  阅读(52)  评论(0)    收藏  举报