乐于分享
好东西不私藏

DeepSeek-OCR解析PDF文件

DeepSeek-OCR解析PDF文件

目标:PDF文件转成可编辑的MD文件

实现思路:先将整体的PDF文件按照页码分割成一个个图片,然后调用DeepSeek-OCR解析图片,将解析的内容存储成MD格式。

只保留核心代码,不包含提升美观和兼容性的代码,不然很不适合初学者。如果不想看过程,可以直接跳至文末,获取代码

使用工具:Python3.13,使用到的库

import osimport requestsimport base64import fitz#如果没有这个库,安装的时候是安装pymupdfimport re

DeepSeek-OCR使用硅基流动的,目前免费,速度也快,如果没有硅基流动的密钥,需要先申请一个。

代码实现

import os#负责打开或者删除文件import requests#调用大模型import base64#将图片转成字符串,方便传输import fitz#将PDF分割成图片import re#提取内容def pdf_to_image(pdf_path, total_pages):    """用PyMuPDF将PDF转为图片"""    doc = fitz.open(pdf_path)    for page_num in range(total_pages):        page = doc[page_num]                pix = page.get_pixmap(dpi=300)# 渲染图片(dpi=300保证清晰度)        temp_img = f"temp_{page_num}.png"        pix.save(temp_img)    doc.close()def ocr_image_to_md(image_path):    """单张图片调用DeepSeek-OCR转MD"""    #将图片转成字符串    with open(image_path, "rb"as f:        b64 = base64.b64encode(f.read()).decode("utf-8")    #调用DeepSeek-OCR    resp = requests.post(        "https://api.siliconflow.cn/v1/chat/completions",        headers={"Authorization"f"Bearer {API_KEY}""Content-Type""application/json"},        json={            "model""deepseek-ai/DeepSeek-OCR",            "messages": [{"role""user""content": [                {"type""text""text""解析内容为markdown格式,原版输出"},                {"type""image_url""image_url": {"url"f"data:image/png;base64,{b64}"}}            ]}],            "temperature"0.0,            "max_tokens"4092,            "stream"False       # 显式关闭流式输出        },        timeout=60    )    #提取转化内容    raw_content=resp.json()["choices"][0]["message"]["content"]    #提取的内容有“}^tokens”这个字符串,不知道为什么,为了内容的干净,把这个字符剔掉    clean_text = re.sub(r"\}\^tokens\s*"'', raw_content).strip()    return clean_text# 核心流程:PDF转图片(无poppler)→ 逐页OCR → 合并MDif __name__ == "__main__":    # 核心配置(替换为你的信息)    API_KEY = "sk-替换为你自己的密钥"    PDF_PATH = r"D:\测试.pdf"  # 待解析PDF    OUTPUT_MD = "output.md"  # 输出MD文件    #获取PDF总页数    doc = fitz.open(PDF_PATH)    total_pages = len(doc)    doc.close()    pdf_to_image(PDF_PATH, total_pages)    print("完成PDF转图片")    # 2. 逐页解析    md_content = ''    for page_idx in range(total_pages):        # 转图片(无poppler)        img_path = f"temp_{page_idx}.png"        # 调用OCR        page_md = ocr_image_to_md(img_path)        md_content +='\n' + page_md        print(f"解析完第{page_idx+1}页")        # 删除临时图片        os.remove(img_path)    # 3. 保存结果,MD文件存在这个py文件的位置    with open(OUTPUT_MD, "w", encoding="utf-8"as f:        f.write(md_content)    print(f"解析完成!结果已保存至 {OUTPUT_MD}")

实现效果

写在最后

我以为这是一个很简单的活,但是AI给的代码总是很冗长,写了很多兼容性的代码,而且也不能直接用,需要一遍遍的改,实现思路也不清晰。写下这篇文章,希望可以让初学者少走一些坑。