從本期開始將整理一些常用的 LaTeX 相關工具,回歸一下本帳號成立的初衷。
簡要介紹#
在過去,最好用的識別數學公式並進行代碼轉換的網站 / 軟體莫過於 Mathpix 了:支持各種格式轉換,比如 pdf,png 到 tex,md,當然也包括 docx 等等,無論是 pdf 文檔轉換還是截圖識別,從移動端的 Snip App 再到桌面客戶端以及網頁版、瀏覽器插件全生態的覆蓋讓使用體驗無比絲滑。
但免費版的使用額度相當有限,而付費訂閱又太貴(一年 50 美刀);此外,網頁版還偶爾會出現網絡連接不穩定的情形。
不過現在,號稱地表最強的 OCR 工具 Mistral 出現了。這是一家法國的初創 AI 公司,可以理解為歐洲版的 DeepSeek,它的價格也十分便宜(OCR 功能大概 1 美刀可以轉換上千頁 pdf)。
使用示例#
文件上傳#
直接訪問官網聊天界面(可能需要用手機號註冊帳號):
像其他大語言模型一樣對話框內上傳文件,輸入 “轉換成 markdown” 即可;比如這裡我上傳了一篇和 DeepSeek-R1 的論文:
等待幾秒鐘,即可得到轉換後的 markdown 代碼。
進一步地,利用 Typora 或 Obsidian 等 markdown 編輯器,即可查看或轉換成 pdf、docx 等格式(可能需要額外安裝 pandoc)。
網頁版效果展示#
更多效果展示請參閱官網介紹:
這是原來的 pdf 文件:
這是轉化後並在 Typora 中顯示的效果(主題:Newsprint):
可以看到,除了圖片外的效果非常不錯,但如果要把圖片也提取出來並在相應位置保留,就需要用到下面的方法了。
進階配置#
除了在官網的對話界面處理文件外,也可以通過 API 調用進行批量處理。
感謝@nicekate 提供的 Python 代碼,可以實現在本地調用 Mistral API 進行文件處理,並且在 B 站上還有相應的演示視頻。
- GitHub 倉庫地址:
https://github.com/nicekate/mistral-ocr - B 站視頻:
【實測 Mistral OCR :世界最佳文檔理解模型?】 https://www.bilibili.com/video/BV1Bw92YiEEH
配置方法也非常簡單,只需要申請一個自己的 API key,然後再把上面的倉庫 clone 下來,填入相應的 API key 即可。
申請 API key#
在控制台左側菜單欄點擊 "API Keys",然後點擊右上角的 “Create new key”,複製即可。
下載 Python 代碼#
先將上述倉庫 clone 到本地:
git clone https://github.com/nicekate/mistral-ocr.git
再安裝依賴項:
pip install mistralai
在pdf_ocr.py
中修改 API 密鑰和 PDF 文件路徑即可(72~73 行):
API_KEY = "填入你自己的api key""
PDF_PATH = "xxx.pdf"
運行文件,即可在同目錄下找到轉換後的文件夾ocr_results_xxx
,其中包含了轉換後的 markdown 文件和圖片文件。
本地轉換效果展示#
主題:Typora GitHub
批處理#
有時需要同時進行多個 PDF 文件的轉換,於是在此基礎上我自己動手增加了批處理功能,可以將同一目錄下的所有 PDF 文件進行轉換。
具體修改如下:
- 新增
get_pdf_files_in_directory
函數,用於掃描指定文件夾並返回所有 PDF 文件的完整路徑。 - 在
__main__
中,替換手動指定 PDF 文件路徑的方式,改為從文件夾中自動獲取 PDF 文件。 - 如果文件夾中沒有 PDF 文件,會提示用戶。
以下是新增的代碼片段:
def process_pdfs(pdf_paths: list, api_key: str) -> None:
for pdf_path in pdf_paths:
try:
output_dir = process_pdf(pdf_path, api_key)
print(f"文件 {pdf_path} 處理完成,結果保存在: {output_dir}")
except Exception as e:
print(f"處理文件 {pdf_path} 時出錯: {e}")
def get_pdf_files_in_directory(directory: str) -> list:
"""獲取指定目錄中的所有PDF文件路徑"""
pdf_files = []
for file in os.listdir(directory):
if file.endswith(".pdf"):
pdf_files.append(os.path.join(directory, file))
return pdf_files
if __name__ == "__main__":
# 使用示例
API_KEY = "your_mistral_api_key"
DIRECTORY = "your_pdf_file" # 指定包含PDF文件的文件夾名稱
# 獲取文件夾中的所有PDF文件
PDF_PATHS = get_pdf_files_in_directory(DIRECTORY)
if not PDF_PATHS:
print(f"目錄 {DIRECTORY} 中沒有找到PDF文件。")
else:
process_pdfs(PDF_PATHS, API_KEY)
完整的文件已上傳至 GitHub,歡迎 star:
參考資料#
- 完美翻譯 PDF 的第一步 - Mistral OCR 初步使用指南 https://zhuanlan.zhihu.com/p/28801320889
- 【實測 Mistral OCR :世界最佳文檔理解模型?】 https://www.bilibili.com/video/BV1Bw92YiEEH
- https://github.com/nicekate/mistral-ocr
- 在前者基礎上增加批處理功能:https://github.com/YZDame/mistral-ocr