使用PyMuPDF库的PDF合并和分拆程序

PDF工具应用程序是一个使用wxPython和PyMuPDF库编写的简单工具,用于合并和分拆PDF文件。它提供了一个用户友好的图形界面,允许用户选择源文件夹和目标文件夹,并对PDF文件进行操作。
C:\pythoncode\blog\pdfmergandsplit.py
在这里插入图片描述

功能特点

  • 选择文件夹:用户可以通过应用程序界面轻松选择源文件夹和目标文件夹。
  • 合并PDF文件:应用程序允许用户选择要合并的PDF文件,并将它们合并成一个单独的PDF文件。
  • 分拆PDF文件:用户可以选择一个PDF文件,将其分拆成多个单独的PDF文件,每个文件包含一个页面。

程序实现

该应用程序使用了以下库和模块:

  • wxPython:用于创建应用程序的图形用户界面。
  • PyMuPDF:用于处理PDF文件的库。

应用程序的主要部分是一个继承自wxPython的wx.Frame类的主窗口。窗口包含以下组件:

  • 选择源文件夹和目标文件夹的按钮。
  • PDF文件列表框,显示源文件夹中的PDF文件。
  • 合并和分拆按钮,用于执行相应的操作。

当用户点击选择源文件夹按钮时,应用程序显示一个文件夹选择对话框,用户可以选择源文件夹。选择后,应用程序获取文件夹路径,并列出文件夹中的PDF文件。然后,合并和分拆按钮变为可用状态,用户可以执行相应的操作。

合并按钮的点击事件会弹出一个文本输入对话框,要求用户输入合并后的文件名。用户输入后,应用程序调用PyMuPDF库合并选定的PDF文件,并将合并后的PDF文件保存到目标文件夹中。

分拆按钮的点击事件会遍历选定的PDF文件,并使用PyMuPDF库将每个页面保存为单独的PDF文件。

代码示例

以下是应用程序的代码示例:

import os
import wx
import fitz

class PDFToolApp(wx.Frame):
    def __init__(self, parent, title):
        super(PDFToolApp, self).__init__(parent, title=title, size=(400, 400))

        self.panel = wx.Panel(self)
        self.source_folder_btn = wx.Button(self.panel, -1, "选择源文件夹")
        self.target_folder_btn = wx.Button(self.panel, -1, "选择目标文件夹")
        self.pdf_list = wx.CheckListBox(self.panel, -1, choices=[], style=wx.LB_MULTIPLE)
        self.merge_btn = wx.Button(self.panel, -1, "合并")
        self.split_btn = wx.Button(self.panel, -1, "分拆")
        self.merge_btn.Disable()
        self.split_btn.Disable()

        self.source_folder_btn.Bind(wx.EVT_BUTTON, self.on_select_source_folder)
        self.target_folder_btn.Bind(wx.EVT_BUTTON, self.on_select_target_folder)
        self.merge_btn.Bind(wx.EVT_BUTTON, self.on_merge)
        self.split_btn.Bind(wx.EVT_BUTTON, self.on_split)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.source_folder_btn, 0, wx.ALIGN_CENTER | wx.ALL, 10)
        sizer.Add(self.target_folder_btn, 0, wx.ALIGN_CENTER | wx.ALL, 10)
        sizer.Add(self.pdf_list, 1, wx.EXPAND | wx.ALL, 10)
        sizer.Add(self.merge_btn, 0, wx.ALIGN_CENTER | wx.ALL, 10)
        sizer.Add(self.split_btn, 0, wx.ALIGN_CENTER | wx.ALL, 10)
        self.panel.SetSizer(sizer)

        self.Show()

    def on_select_source_folder(self, event):
        dlg = wx.DirDialog(self, "选择源文件夹", style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            source_folder_path = dlg.GetPath()
            self.pdf_list.Set(self.get_pdf_files(source_folder_path))
            self.merge_btn.Enable()
            self.split_btn.Enable()
        dlg.Destroy()

    def on_select_target_folder(self, event):
        dlg = wx.DirDialog(self, "选择目标文件夹", style=wx.DD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            self.target_folder_path = dlg.GetPath()
        dlg.Destroy()

    def on_merge(self, event):
        selected_items = self.pdf_list.GetCheckedItems()
        if len(selected_items) > 0:
            dlg = wx.TextEntryDialog(self, "请输入合并后的文件名(不带扩展名):", "合并文件")
            if dlg.ShowModal() == wx.ID_OK:
                output_filename = dlg.GetValue()
                output_filepath = os.path.join(self.target_folder_path, output_filename + ".pdf")
                self.merge_pdfs(selected_items, output_filepath)
                wx.MessageBox("PDF文件合并完成!", "完成", wx.OK | wx.ICON_INFORMATION)
            dlg.Destroy()

    def on_split(self, event):
        selected_items = self.pdf_list.GetCheckedItems()
        if len(selected_items) > 0:
            for index in selected_items:
                pdf_filename = self.pdf_list.GetString(index)
                pdf_filepath = os.path.join(self.target_folder_path, pdf_filename)
                self.split_pdf(pdf_filename, pdf_filepath)
            wx.MessageBox("PDF文件分拆完成!", "完成", wx.OK | wx.ICON_INFORMATION)

    def merge_pdfs(self, selected_items, output_filepath):
        pdf_merger = fitz.open()

        for index in selected_items:
            pdf_filename = self.pdf_list.GetString(index)
            pdf_filepath = os.path.join(self.target_folder_path, pdf_filename)
            pdf = fitz.open(pdf_filepath)
            pdf_merger.insert_pdf(pdf)

        pdf_merger.save(output_filepath)
        pdf_merger.close()

    def split_pdf(self, pdf_filename, pdf_filepath):
        pdf = fitz.open(pdf_filepath)
        num_pages = pdf.page_count

        for i in range(num_pages):
            output_filename = f"{pdf_filename[:-4]}_{i+1}.pdf"
            output_filepath = os.path.join(self.target_folder_path, os.path.basename(output_filename) )
            print("output_filename:"+output_filename)
            page = pdf[i]
            new_pdf = fitz.open()
            new_pdf.insert_pdf(pdf, from_page=i, to_page=i)
            new_pdf.save(output_filepath)
            print("self.target_folder_path:"+self.target_folder_path)
            print("output_filepath:"+output_filepath)
            new_pdf.close()

        pdf.close()

    def get_pdf_files(self, folder_path):
        pdf_files = []
        for filename in os.listdir(folder_path):
            if filename.endswith(".pdf"):
                pdf_files.append(folder_path+'/'+filename)
        return pdf_files

if __name__ == "__main__":
    app = wx.App()
    PDFToolApp(None, "PDF工具")
    app.MainLoop()

总结

PDF工具应用程序是一个使用wxPython和PyMuPDF库编写的简单实用工具,可用于合并和分拆PDF文件。它提供了一个直观的图形界面,使用户能够轻松选择文件夹和执行操作。无论是处理大量PDF文件还是简单的分拆操作,该应用程序都能满足用户的需求。

<think>好的,用户想了解PyMuPDFollama的结合使用。首先,我需要确认这两个各自的用途。PyMuPDF主要用于处理PDF文件,比如提取文本、图像,或者进行页面操作。而Ollama应该是一个大语言模型,可能用于自然语言处理任务。 接下来,我需要考虑用户可能的应用场景。他们可能想从PDF中提取信息,然后用Ollama进行分析或生成回答。例如,从一份报告中提取数据,再让模型总结内容,或者回答基于PDF内容的问题。 然后,我需要检查这两个如何结合。可能需要先用PyMuPDF读取PDF内容,将文本提取出来,再通过Ollama的API或本地模型处理这些文本。要注意的是,Ollama可能有输入长度限制,处理长文本时需要分块或者摘要。 还需要考虑安装基本用法。用户可能需要示例代码,展示如何读取PDF并用Ollama处理。同时,要提醒可能的错误,比如编码问题、模型加载失败,或者API密钥的配置。 另外,用户可能对实际应用案例感兴趣,比如自动化文档处理、智能问答系统等。需要举一些具体的例子,说明结合后的优势,比如提高效率,自动化分析等。 最后,确保语言简洁明了,步骤清晰,让用户能够跟随操作。同时,提醒可能的注意事项,比如依赖版本、模型选择等。</think>PyMuPDF Ollama 是两个不同领域的工具,结合使用可以实现文档处理与自然语言处理的结合应用。以下是它们的介绍及结合使用的场景示例: --- ### **1. PyMuPDF 简介** **PyMuPDF** 是一个强大的 Python PDF 处理,支持 PDF、EPUB 等格式的解析操作。主要功能包括: - **文本提取**:从 PDF 中提取文字内容。 - **元数据获取**:读取作者、标题等信息。 - **页面操作**:拆分合并、旋转页面。 - **图像提取**:从 PDF 中提取图片。 - **高亮标注**:添加注释或标记。 **示例代码**: ```python import fitz # PyMuPDF 的导入名称 doc = fitz.open("example.pdf") text = "" for page in doc: text += page.get_text() print(text) ``` --- ### **2. Ollama 简介** **Ollama** 是一个本地化的大语言模型(LLM)运行工具,支持在本地部署运行如 LLaMA、Mistral 等开源模型。特点包括: - **本地运行**:无需联网,保护隐私。 - **多模型支持**:可切换不同规模的模型。 - **API 交互**:通过 REST API 或命令行调用模型。 **典型用途**: - 生成文本、翻译、问答 - 文档摘要、数据分析 - 代码生成等 --- ### **3. 结合使用场景** 将 PyMuPDF Ollama 结合,可实现 **PDF 内容自动化处理 + 自然语言分析**: #### **场景示例:PDF 内容问答系统** 1. **用 PyMuPDF 提取 PDF 文本**: ```python def extract_pdf_text(file_path): doc = fitz.open(file_path) return "".join([page.get_text() for page in doc]) ``` 2. **用 Ollama 分析文本**(通过 API 或 SDK): ```python import requests # 假设 Ollama 提供本地 API def ask_ollama(question, context): response = requests.post( "http://localhost:11434/api/generate", json={ "model": "llama2", "prompt": f"基于以下内容回答问题:{context}\n\n问题:{question}" } ) return response.json()["response"] ``` 3. **整合流程**: ```python pdf_text = extract_pdf_text("report.pdf") answer = ask_ollama("总结这份报告的核心观点", pdf_text) print(answer) ``` --- ### **4. 进阶应用** - **自动化文档处理**:批量提取 PDF 数据,生成摘要或分类。 - **智能合同审核**:提取合同条款,用 LLM 检查风险点。 - **研究辅助**:从学术论文中提取关键结论,生成文献综述。 --- ### **注意事项** 1. **文本长度限制**:Ollama 的模型可能有输入长度限制,长文本需分块处理。 2. **模型选择**:根据任务复杂度选择合适模型(如 `mistral` 更适合复杂分析)。 3. **本地资源**:大模型需较高计算资源,确保硬件足够。 如果需要更具体的代码示例或场景设计,可以进一步说明需求!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值