安利一个贼强的 pdf 转 markdown 工具 doc2x

本贴最后更新于 220 天前,其中的信息可能已经东海扬尘

安利一个好东西 doc2x,可以把 pdf 直接转成 markdown,扫描的 pdf 也行

流程大概这个样子,doc2xpdf 识别转 markdown 然后导入思源,稍作排版,太舒服了,简单的格式排版之后堪比原书的排版

doc2x 的网址:https://doc2x.com

一个手机号免费转 500 页,如果有邀请码有五天的 pro 会员可以转 1000 页,后面邀请别人可以获得 5 天的 pro 会员时常,就是一天能转 1000 页的。不过这个年头谁还没有几个手机号是吧。。。

下图是一本概率论的 pdf 转 markdown 之后导入思源笔记之后的排版效果

image.png

doc2x 的公式识别贼准,还能识别图片,比如下图这种

image.png

目前发现有几个小缺点:

  1. 有些表格可能会用 html 的表格标记标记出来
  2. 标题的层级容易识别错误,基本所有标题识别出来都是二级标题
  3. 对于排版格式很花哨的标题识别效果不是特别好,比如标题前面有个手指头指着那种。。。。。每次看得眼花缭乱的,咱也不知道这种排版的好处在哪里,咱也不敢问。

不过这两个小问题都很简单

第一个就抽取出来交给 gpt 让他帮你修改一下

第二个就正则匹配一下各级标题给一下各级标题的排版就好,我用的是 vscode,里面支持正则匹配然后替换,这样就不用写代码了 hhhh,没试过其他编辑器不过应该也可以的把。,比如下图的把章节修改为一级标题。

image.png

下面是一段我写的抽取<table></table> 表格然后转化为 markdown 表格的代码,大家有需要的话自己拿去改一改哈。

import re
import asyncio
from tqdm import tqdm
from openai import AsyncOpenAI
import openai

# 确保你有 OpenAI 的 API 密钥
openai.api_key = "sk-xxxxxxxxxxxxx"
openai.base_url = "https://xxxxxxxxxxx"
openai.default_headers = {"x-foo": "true"}

client = AsyncOpenAI(api_key=openai.api_key, base_url=openai.base_url, default_headers=openai.default_headers)

MAX_WORKERS = 60
MAX_RETRIES = 3  # 最大重试次数
bar = tqdm(total=0)

async def get_markdown(data):
    data = data.replace("```markdown", "")
    data = data.replace("```", "")
    return data

async def chat_with_gpt4(semaphore, messages):
    async with semaphore:
        try:
            completion = await client.chat.completions.create(
                model="gpt-4o",
                messages=messages,
                temperature=0.6
            )
            answer = completion.choices[0].message.content
            return answer
        except Exception as e:
            print(f"GLM-4-Air 调用错误: {e}")
            return None

async def process_table_async(semaphore, table_html, retry_count=0):
    prompt = """
    你需要将我所给你的内容转换为markdown表格,只用输出markdown文本,不用做任何解释
    """
    try:
        answer_text = await chat_with_gpt4(
            semaphore,
            [
                {"role": "system", "content": prompt},
                {"role": "user", "content": table_html}
            ]
        )
        markdown_table = await get_markdown(answer_text)

        if not markdown_table and retry_count < MAX_RETRIES:
            return await process_table_async(semaphore, table_html, retry_count + 1)
        bar.update(1)
        return markdown_table
    except Exception as e:
        print(e)
        if retry_count < MAX_RETRIES:
            return await process_table_async(semaphore, table_html, retry_count + 1)
        else:
            return None

def replace_table_contents(markdown_content):
    table_pattern = re.compile(r'(<table.*?>.*?</table>)', re.DOTALL)
    semaphore = asyncio.Semaphore(MAX_WORKERS)

    async def process_all_tables(tables):
        tasks = [process_table_async(semaphore, table) for table in tables]
        return await asyncio.gather(*tasks)

    tables = table_pattern.findall(markdown_content)
    bar.total = len(tables)
    processed_tables = asyncio.run(process_all_tables(tables))
  
    for original, processed in zip(tables, processed_tables):
        if processed:
            markdown_content = markdown_content.replace(original, processed)
  
    return markdown_content

if __name__ == "__main__":
    markdown_file_name = "MD概率论与数理统计 第五版\概率论与数理统计 第五版.md"
    out_put_file_name = "MD概率论与数理统计 第五版\概率论与数理统计 第五版out.md"
    with open(markdown_file_name,"r",encoding="utf-8") as f:
        markdown_content = f.read()
    # 处理 HTML 内容
    processed_content = replace_table_contents(markdown_content)
    with open(out_put_file_name,"w",encoding="utf-8") as f:
        f.write(processed_content)

最后,doc2x 里面还有一个 pdf 翻译的功能,虽然我不咋用得到,但是真的好强呀,比如下面几个图

到处原文和译文的

a03e6ca692036f81e871e7266ffd302.png

直接导出译文的

a676d471a6f0cc1d3858459a02e2bbb.png

8122156cc8e2911b3d8012bbdbc263b.png

1d326adf18423ccf720987748b5d7ae.png

  • doc2x
    2 引用 • 3 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    292 引用 • 738 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 叶归
    4 引用 • 11 回帖 • 6 关注
  • 印象笔记
    3 引用 • 16 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖 • 1 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 649 关注
  • Excel
    30 引用 • 28 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 266 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 654 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    107 引用 • 127 回帖 • 365 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 547 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 438 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 423 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 9 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 731 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    948 引用 • 943 回帖
  • 安全

    安全永远都不是一个小问题。

    203 引用 • 816 回帖
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 86 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 68 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 39 关注
  • CodeMirror
    1 引用 • 2 回帖 • 141 关注
  • AWS
    11 引用 • 28 回帖 • 3 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 751 关注
  • sts
    2 引用 • 2 回帖 • 202 关注