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

安利一个好东西 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 回帖
  • 工具

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

    288 引用 • 734 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • H2

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

    11 引用 • 54 回帖 • 658 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖 • 2 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8214 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    123 引用 • 74 回帖
  • Flume

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

    9 引用 • 6 回帖 • 633 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖 • 1 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖
  • Facebook

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

    4 引用 • 15 回帖 • 447 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • 周末

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

    14 引用 • 297 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 609 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    27 引用 • 225 回帖 • 173 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 168 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 8 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 137 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 5 关注
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 662 关注
  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 561 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1328 回帖
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 5 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 28 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖 • 8 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    66 引用 • 114 回帖 • 227 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖