Python练手项目:PDF小工具-fitz版

Python练手项目:PDF小工具-fitz版
python对办公一族来说,是个提高办公效率的得力利器。熟练使用它,可以轻松完成很多繁杂的事情。它可以轻松地操作Word、Excel、PDF这种文档。
今天需要整理一份资料,需要把多个pdf合并为一个,wps这些软件自然是有这个功能,但一般都是收费的,百度上也有很多网站,但资料上传到别人的网站,始终觉得还是不太可靠,故自己搜索了一下使用python来处理pdf文件,故此用tk制作了PDF小工具。
安装以下库:
python -m pip install -U pip
pip install PyMuPDF==1.19.0 -i https://pypi.mirrors.ustc.edu.cn/simple/
pdf_tool_fitz.py
源码如下:

#pip install PyMuPDF==1.19.0 -i https://pypi.mirrors.ustc.edu.cn/simple/
from pathlib import Path
import subprocess
import time
import sys
import tkinter as tk
from tkinter import ttk
import tkinter.filedialog as fd
import tkinter.messagebox as mb
import base64
import fitz
import threading

class PdfHandler:
    page_count=None
    page_index=None
    img_path=None
    def pdf_to_imgs(self,pdf_path,img_path,zoom_x,zoom_y,rotation_angle):
        '''
        pdf文件每页内容都转换成图片
        :param pdf_path:pdf文件的路径
        :param img_path:图像要保存的路径
        :param zoom_x:x方向的缩放系数
        :param zoom_y:y方向的缩放系数
            zoom_x和zoom_y一般取相同值,值越大,图像分辨率越高
        :param rotation_angle:旋转角度
        :return:
        '''
        # 如果没有存储文件的目录,则创建
        if not Path(img_path).exists():
            Path(img_path).mkdir()
            
        # 打开PDF文件
        with fitz.open(pdf_path) as pdf:
            self.page_count=pdf.page_count
            # 逐页读取PDF
            for page_index in range(0, pdf.pageCount):
                self.page_index=page_index
                page = pdf[page_index]
                # 设置缩放和旋转系数,zoom_x, zoom_y取相同值,表示等比例缩放
                trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotation_angle)
                pm = page.getPixmap(matrix=trans, alpha=False)
                self.img_path=f'{img_path}/{page_index}.png'
                self.img_path=self.img_path.replace('/',"\\")
                # 开始写图像
                pm.writePNG(self.img_path) # 第1张图片名:0.png,以此类推
                pm=None

    def imgs_to_pdf(self,img_path, new_pdf_name):
        '''
        将图片转为pdf
        :param imgPath: 图片路径
        :param new_pdf_name: 多张图片合并成的pdf文件名
        :return:
        '''
        with fitz.open() as doc:  # 新建一个空文档
            img_list=[]
            for item in Path(img_path).iterdir():
                img_list.append(item.name)
            for page_index in range(len(img_list)):
                self.page_index=self.page_index+1
                img = fitz.open(f'{img_path}/{page_index}.png')  # 打开图片
                pdfbytes = img.convertToPDF()  # 使用图片创建单页的 PDF
                with fitz.open("pdf", pdfbytes) as imgpdf:
                    doc.insert_pdf(imgpdf)
                img.close()
            doc.save(new_pdf_name)
    
    def imgs_2_pdf(self,old_pdf_names, new_pdf_name):
        '''
        将图片转为pdf
        :param imgPath: 图片路径
        :param new_pdf_name: 多张图片合并成的pdf文件名
        :return:
        '''
        with fitz.open() as doc:  # 新建一个空文档
            for old_pdf_name in old_pdf_names:
                img = fitz.open(old_pdf_name)  # 打开图片
                pdfbytes = img.convertToPDF()  # 使用图片创建单页的 PDF
                with fitz.open("pdf", pdfbytes) as imgpdf:
                    doc.insert_pdf(imgpdf)
                img.close()
            doc.save(new_pdf_name)
    
    def img_invert_img(self,old_img_name, new_img_name):
        '''
        将图片转为pdf
        :param imgPath: 图片路径
        :param new_pdf_name: 多张图片合并成的pdf文件名
        :return:
        '''
        with fitz.open() as doc:  # 新建一个空文档
            img = fitz.open(old_img_name)  # 打开图片
            pdfbytes = img.convertToPDF()  # 使用图片创建单页的 PDF
            with fitz.open("pdf", pdfbytes) as imgpdf:
                doc.insert_pdf(imgpdf)
            img.close()
            img = doc.get_page_images(0)[0]
            xref = img[0] #图片的xref编号,
            base = img[1] #图片的基本名字,比如 'img0'
            pix = fitz.Pixmap(doc, xref)
            if pix.n < 5:  # 这是一个灰度或者RGB图片
                pix.invertIRect()
                pix.writePNG(new_img_name)
            else:  # 这是一个CMYK图片
                pix1 = fitz.Pixmap(fitz.csRGB, pix)
                pix1.invertIRect()
                pix1.writePNG(new_img_name)
                pix1 = None
            pix = None
            '''
            pm=doc[0].getPixmap(dpi=600,alpha=False)
            pm.invertIRect()
            pm.writePNG(new_img_name)
            pm=None
            '''
    
    def merge_pdfs(self,old_pdf_names,new_pdf_name):
        '''
        从pdf文件合成为新的pdf文件
        :param old_pdf_names: pdf文件名数组
        :param new_pdf_name: 合并出的新pdf文件名
        :return:
        '''
        print(old_pdf_names)
        print(new_pdf_name)
        file_writer = fitz.open()
        for pdf in old_pdf_names:
            file_reader = fitz.open(pdf)# 循环读取需要合并pdf文件
            file_writer.insert_pdf(file_reader)
            file_reader.close()
        file_writer.save(new_pdf_name)
        file_writer.close()
   
    def split_pdf(self,old_pdf_name, new_pdf_name, from_page, to_page):
        '''
        从pdf文件中拆分出部分,拆出部分成为新的pdf文件
        :param old_pdf_name: 原pdf文件名
        :param new_pdf_name: 拆分后合并出的新pdf文件名
        :param from_page: 原pdf文件起始页码索引(0开始,默认0)
        :param to_page: 原pdf文件结尾页码索引(0开始,默认最后一页)
        :return:
        '''
        with fitz.open(old_pdf_name) as old_pdf, fitz.open() as new_pdf:
            print(f"从:{from_page}")
            to_page-=1
            print(f"到:{to_page}")
            new_pdf.insert_pdf(old_pdf,from_page,to_page)
            new_pdf.save(new_pdf_name)
            
    def get_pdf_text(self,pdf_path):
        '''
        获取每页pdf文件文本
        :param pdf_path: pdf文件路径
        :return:
        '''
        # 打开pdf文件,并新建html文件
        with fitz.open(pdf_path) as pdf:

            # 遍历每一页pdf,并显示进度条
            for page in pdf:
                text = page.get_text() #提取文本,传入参数'html'即:page.get_text('html') 则提取每页内容为html
            print(f'第{page+1}页解析内容:\n{text}')
    
    def get_pdf_images(self,img_path,pdf_path):
        '''
        获取每页pdf文件所有图片
        :param pdf_path: pdf文件路径
        :return:
        '''
        # 如果没有存储文件的目录,则创建
        if not Path(img_path).exists():
            Path(img_path).mkdir()
        doc = fitz.open(pdf_path)
        self.page_count=doc.page_count
        page_index=0
        for i in range(len(doc)):
            self.page_index=i
            for img in doc.get_page_images(i):
                xref = img[0] #图片的xref编号,
                #base = img[1] #图片的基本名字,比如 'img0'
                pix = fitz.Pixmap(doc, xref)
                self.img_path=f"{img_path}/{page_index}.png"
                if pix.n < 5:  # 这是一个灰度或者RGB图片
                    pix.writePNG(self.img_path)
                else:  # 这是一个CMYK图片
                    pix1 = fitz.Pixmap(fitz.csRGB, pix)
                    pix1.writePNG(self.img_path)
                    pix1 = None
                pix = None  # 让图片像素图清除内存
                page_index+=1
        doc.close()

# 防止字符串乱码
# os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
data=[]
id=0
mydir='D:/'
kind='PDF'
PdfHandler=PdfHandler()

def thread_it(func,args):
	'''将函数打包进线程'''
	# 创建
	t = threading.Thread(target=func, args=args)
	# 守护 !!!
	t.setDaemon(True)
	# 启动
	t.start()
	# 阻塞--卡死界面!
	# t.join()

def base64_to_image(base64_string, image_path):
    base64_data = base64_string.encode("utf-8")
    image_data = base64.b64decode(base64_data)
    with open(image_path, "wb") as image_file:
        image_file.write(image_data)

base64_string = '''
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
<think>首先,用户的问题是:“我想查找使用Python读取无法直接复制的PDF文件的方法 请问Python读取无法直接复制的PDF文件的方法”。这涉及到读取那些PDF文件,这些文件的内容无法直接复制,可能是由于加密、扫描或其他原因。 从系统指令中: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾添加引用标识。 - 回答结构清晰,逐步解决问题。 用户提供的引用: - 引用[1]:关于使用PyPDF2读取PDF,包括打开文件、获取页数、提取文本、检查加密、旋转页面、合并页面、写入加密PDF等。 - 引用[2]:关于从PDF中提取数据表,特别是表格数据。 - 引用[3]:关于将PDF文件转换为图片。 用户的问题是读取“无法直接复制的PDF文件”。这些通常是扫描的PDF或图像型PDF,内容不是文本而是图像,所以无法复制文本。常见的解决方法包括: - 使用OCR(光学字符识别)来提取文本。 -PDF转换为图像,然后使用OCR库处理。 在Python中,常用的库有: - PyPDF2:用于处理PDF文件,但如果PDF是扫描的,PyPDF2可能无法提取文本,因为它依赖于PDF中的文本层。 - PDFMiner:更适合文本提取,可以处理一些扫描的PDF,但可能需要OCR。 - Tesseract OCR:开源OCR引擎,可以与Python集成。 - PyMuPDF(也称为fitz):另一个强大的PDF处理库,支持OCR。 - pdfplumber:简化PDF文本提取,包括表格数据。 - 结合图像处理库如Pillow和OCR库如pytesseract。 从引用中: - 引用[1]提到PyPDF2,但如果PDF是加密的或扫描的,可能需要额外步骤。 - 引用[2]讨论提取数据表,这可能涉及OCR如果PDF是扫描的。 - 引用[3]提到将PDF转换为图片,这是OCR的第一步。 所以,对于无法直接复制的PDF,关键在于OCR。 我的回答应该: 1. 解释问题:为什么PDF无法复制(扫描或图像型)。 2. 提供方法:使用OCR技术。 3. 逐步指导:如何用Python实现。 4. 参考引用:用户在引用中提到的PyPDF2等库。 5. 生成相关问题。 结构: - 引言:解释什么是无法复制PDF- 方法一:使用OCR库(如Tesseract)结合PDF转图片。 - 方法二:使用支持OCR的PDF库(如PyMuPDF)。 - 代码示例:简单示例。 - 注意事项:如性能、准确性。 - 相关问题。 使用中文。 添加引用标识:在引用段落末尾,如[^1]。 生成相关问题:在最后。 由于用户提到“参考站内引用”,我应该基于引用提供的代码结合问题来回答。引用[1]有PyPDF2代码,但它用于处理文本PDF;引用[3]有PDF转图片代码。 最佳方法是: 1. 先将PDF转换为图像(使用库如PyMuPDFpdf2image)。 2. 然后使用OCR库(如pytesseract)提取文本。 代码示例: - 使用pdf2image转换PDF为图像。 - 使用pytesseract进行OCR。 引用用户提供的引用作为参考,但需注明。 回答大纲: 1. **问题解释**:无法复制的PDF通常是扫描的或图像型PDF。PyPDF2等库可能无法提取文本,因为文本不是嵌入的。 2. **解决方案**:使用OCR技术。 3. **所需库**: - 安装:pip install PyMuPDF (或 fitz) 或 pdf2image, pytesseract, Pillow, tesseract-ocr(系统安装)。 4. **步骤**: a.PDF转换为图像。 b. 对每个图像应用OCR提取文本。 5. **代码示例**:基于引用[3]给出转换代码,添加OCR部分。 6. **注意事项**:OCR可能不完美;确保Tesseract安装;处理加密PDF等。 7. **相关问题**:生成几个相关问题。 生成相关问题: 1. 如何提高PDF OCR的准确性? 2. 如何处理大型PDF文件的OCR? 3. 有哪些替代库用于PDF文本提取? 确保回答清晰、可靠。 </think>### Python读取无法直接复制的PDF文件的方法 无法直接复制的PDF文件(如扫描或图像型PDF)通常不包含可选的文本层,而是由图像组成。这可能导致常规PDF文本提取库(如PyPDF2)失败,因为它们依赖于嵌入的文本数据。解决此类问题的核心方法是使用OCR(光学字符识别)技术:先将PDF页面转换为图像,再应用OCR库识别图像中的文本。以下我将逐步解释方法并提供Python代码示例(基于用户提供的引用和常见库)。 #### 步骤1: 理解问题与解决方案原理 - **为什么无法复制?** 这类PDF是扫描文档或图像文件,文本信息未被嵌入为可提取的数据层,而是以像素形式存在[^2]。直接使用PyPDF2的`extract_text()`方法可能返回空字符串或错误[^1]。 - **解决方案原理**: 1. **PDF转图像**:将PDF的每一页转换为图像格式(如PNG或JPG)。 2. **OCR处理**:使用OCR引擎(如Tesseract)识别图像中的文本。 - **推荐Python库**: - `PyMuPDF`(或`fitz`):高效处理PDF转换和OCR(免费、开源)。 - `pytesseract`:Python封装Tesseract OCR引擎。 - `pdf2image`:将PDF转换为图像序列(可选)。 - `Pillow`(PIL):图像处理库。 - **安装命令**: ```bash pip install PyMuPDF pytesseract pdf2image pillow # 还需单独安装Tesseract OCR引擎:https://github.com/tesseract-ocr/tesseract ``` #### 步骤2: 方法实现(逐步指导) 以下提供两种常用方法。方法一使用`PyMuPDF`(集成度高),方法二使用`pdf2image` + `pytesseract`(灵活性高)。代码基于用户引用[^1]和[^3]优化。 ##### 方法一:使用PyMuPDF(推荐,支持直接OCR) `PyMuPDF`库内置OCR功能,适合处理扫描PDF。它先将PDF页面渲染为图像,然后应用OCR识别文本。 ```python import fitz # PyMuPDF的别名 def extract_text_from_scanned_pdf(pdf_path, output_text_path): """ 提取扫描PDF的文本并保存到文件。 :param pdf_path: PDF文件路径 :param output_text_path: 输出文本文件路径 """ doc = fitz.open(pdf_path) # 打开PDF文件 text = "" # 遍历每一页,应用OCR提取文本 for page_num in range(len(doc)): page = doc.load_page(page_num) pix = page.get_pixmap() # 将页面渲染为图像 img_bytes = pix.tobytes("png") # 转换为PNG格式字节流 # 使用PyMuPDF内置OCR识别文本 text += page.get_text("ocr") # "ocr"参数启用OCR模式 # 保存提取的文本到文件 with open(output_text_path, "w", encoding="utf-8") as f: f.write(text) doc.close() print(f"文本提取完成,已保存到 {output_text_path}") # 示例用法(替换为您的PDF路径) extract_text_from_scanned_pdf("无法复制的.pdf", "提取的文本.txt") ``` - **优点**:简单高效,无需额外转换步骤。 - **缺点**:OCR准确性依赖Tesseract安装质量;确保系统已安装Tesseract。 ##### 方法二:使用pdf2image + pytesseract(手动控制OCR) 如果需更细致的图像处理(如调整分辨率),可结合`pdf2image`和`pytesseract`。 ```python from pdf2image import convert_from_path import pytesseract from PIL import Image import os def pdf_to_text_via_ocr(pdf_path, output_text_path, dpi=300): """ 通过PDF转图像+OCR提取文本。 :param pdf_path: PDF文件路径 :param output_text_path: 输出文本文件路径 :param dpi: 图像分辨率,默认300(值越高精度越好,但速度慢) """ # Step 1:PDF转换为图像列表 images = convert_from_path(pdf_path, dpi=dpi) text = "" # Step 2: 遍历每个图像并OCR识别 for i, img in enumerate(images): img_path = f"temp_page_{i}.png" # 临时保存图像 img.save(img_path, "PNG") # 使用pytesseract识别图像文本 text += pytesseract.image_to_string(Image.open(img_path), lang='chi_sim+eng') # 支持中英文 os.remove(img_path) # 删除临时文件 # Step 3: 保存提取的文本 with open(output_text_path, "w", encoding="utf-8") as f: f.write(text) print(f"文本提取完成,已保存到 {output_text_path}") # 示例用法(替换为您的PDF路径) pdf_to_text_via_ocr("无法复制的.pdf", "提取的文本.txt") ``` - **基于引用[^3]**:此方法类似用户提到的PDF转图片过程,但添加了OCR步骤以实现文本提取。 - **参数说明**: - `dpi=300`:提高分辨率可改善OCR精度(但增加处理时间)。 - `lang='chi_sim+eng'`:指定语言(中文简体+英文),根据需要调整。 - **注意事项**: - 确保Tesseract正确安装:下载并添加到系统PATH。 - 处理加密PDF前,需先解密(可使用PyPDF2检查加密状态,如引用[^1]中的`pdfReader.is_encrypted`)。 - OCR准确性受图像质量影响:模糊或扭曲文本可能需要预处理(如使用Pillow调整对比度)。 #### 步骤3: 常见问题与优化建议 - **性能问题**: - 大型PDF处理慢:通过`pdf2image`的`thread_count`参数并行处理。 - 内存不足:分批处理页面(如在循环中逐页OCR)。 - **提高OCR精度**: - 预处理图像:使用Pillow增强对比度或降噪。 - 训练Tesseract模型:针对特定字体自定义OCR模型。 - **替代方法**: - 使用`pdfplumber`库提取文本(但可能对扫描PDF无效)。 - 商业API如Google Cloud Vision(高精度但收费)。 #### 总结 对于无法直接复制的PDF文件,OCR是可靠解决方案。推荐使用`PyMuPDF`(方法一)作为首选,因为它简化了流程;如果需更多控制,可选用`pdf2image` + `pytesseract`(方法二)。实际应用中,测试不同分辨率(dpi)以平衡速度与准确性。如果PDF加密需先解密(参考引用[^1]的加密处理代码)[^1][^2][^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值