
TranslateBooksWithLLMs PDF翻译能力解析标题、表格与字体如何被保留【免费下载链接】TranslateBooksWithLLMsTranslate full-length books and documents with Ollama, OpenAI-compatible, Gemini, Mistral, DeepSeek, Poe or OpenRouter. Preserves formatting. Resumes where you left off. No file size limits.项目地址: https://gitcode.com/gh_mirrors/tr/TranslateBooksWithLLMsTranslateBooksWithLLMs 是一款用大语言模型LLM整本翻译书籍与文档的桌面工具支持的格式包括 EPUB、SRT、DOCX、PDF 和 TXT。它的 PDF 翻译能力采用“重排式输出”原文 PDF 被解析成段落与结构单元交给大模型翻译后再生成一份新的、排版重排的 PDF——标题、表格、字体三大要素在这条流水线中被尽量保留。PDF翻译是如何一步步工作的整条流水线分三步核心代码集中在 src/core/pdf/ 目录下提取extractor.py 用 PyMuPDF 把 PDF 拆成段落列表同时记录每段的样式标题级别、列表、表格单元格、格式颜色、字体族、加粗、背景色块与表格结构统一存入 content.py 中的PdfPlainContent数据模型。翻译段落直接复用项目的纯文本翻译管线 plain_text_pipeline.py天然支持断点续翻与并行分块。重建builder.py 把译文段落拼装成 HTML CSS通过 PyMuPDF 的 Story/DocumentWriter 渲染成与原文同页宽的新 PDF。需要特别说明它保留的是结构属性标题、表格、字体、颜色、色块、图片锚点而不是原始版式——页面上的每一行都可能在新的页面上重新流动。这也是为什么多栏排版只算“尽力而为”。标题识别字号比例三级判级标题识别是提取器里最“聪明”的一环逻辑在 extractor.py 的_block_style函数中先算正文基准字号统计全文所有保留文本块的字符加权主字号作为“body size”。再按字号比例判级阈值定义见 extractor.py判定结果条件heading1字号 ≥ 正文 1.6 倍且不超过 200 字符heading2字号 ≥ 正文 1.3 倍heading3字号 ≥ 正文 1.15 倍加粗兜底整段加粗、不超 80 字符、不超过 2 行且不以句末标点结尾还有一个容易忽略的细节标题块拆分。当同一个文本块内相邻行的字号比值达到 1.15 倍SIZE_SPLIT_RATIO或主色明显不同就会强制拆成多个子块——这样“眉题 大标题 副标题”三种层次能各自获得正确的样式而不会糊在一起。到了重建阶段builder 会把三类标题映射为h1/h2/h3分别以 20pt、16pt、13pt 的无衬线粗体输出标题的层级感在译文 PDF 中完整再现。表格重建连“只有横线”的表格也能认出表格检测独立在 layout.py 中识别两类来源全边框表格直接调用 PyMuPDF 自带的page.find_tables()保留行列数 ≥ 2 的表格。横线网格表格这是为现代网页打印 PDF 专门做的适配——无头 Chrome/Skia 打印时会把每个单元格的border-bottom画成一小段独立填充矩形。检测器从page.get_drawings()中收集这些细横线段把共享相同列边界的横线聚成“网格”再结合表头底色或表格上方文字确定顶边最后用显式行列模式精确抽出每个单元格。抽出表格后发生两件事每个非空单元格成为独立翻译单元样式标记为cell空单元格记为占位保证译文表与原表行列一一对应见 content.py 的PdfTable结构。表头识别与底色保留表头行的背景色、各列的相对宽度都被记录重建时表头单元格加粗并保留底色列宽按比例换算为绝对 pt 宽度还原。字体保留名称、标志位与 Type3 三重解析字体相关逻辑集中在 styling.py目标是把 PDF 里五花八门的字体名归类为三个通用族serif衬线、sans-serif无衬线、monospace等宽。解析策略按优先级字体名关键词命中mono/courier/menlo…判等宽sans/helvetica/arial/calibri…判无衬线serif/times/georgia…判衬线PyMuPDF 字形标志位名称无法识别时回退到 span flags位 4 衬线、位 8 等宽、位 16 粗体、位 2 斜体Type3 字体穿透浏览器打印的 PDF 常用Type3 (16 0 R)这种引用名FontResolver会顺着 FontDescriptor 找到真实字体名如IBM-Plex-Sans-Bold从而正确识别粗体与字体族。除此之外每个段落还会记录文字颜色、整段加粗/斜体、背景色块带左侧色条的 callout 提示框。builder 在重建时把这些信息转成内联 CSS正文整体字体族则取全文段落的主导值default_font_family写进样式表的body规则——所以即使个别段落字体未知整本书的“字体气质”也保持一致。使用指南与已知限制用命令行翻译一份 PDF 只需一行python translate.py -i paper.pdf -tl French输出会自动命名为paper (French).pdf详见 docs/CLI.md。Web 界面中则直接拖入.pdf即可翻译任务中途暂停后可随时从断点继续见文章开头截图。⚠️ 新手使用前的几个提示仅支持文字型 PDF扫描件会明确报错不做 OCR带密码的 PDF 在上传时即被拒绝。原文版式不保留输出是重排的新 PDF多栏、脚注等复杂排版是尽力而为。句内格式不保留加粗、颜色只按“整段”粒度保留句子中间的局部强调会丢失。暂不支持润色--refine对 PDF 会给出警告并忽略详见 docs/BACKLOG.md。如果你想了解这项能力的设计取舍项目保留了完整的规划文档BLUEPRINT_PdfSupport.md基础能力与 BLUEPRINT_PdfFormattingA.md表格、色块与字体保真回归测试则在 tests/test_pdf/ 中覆盖了解析与重建的往返一致性。【免费下载链接】TranslateBooksWithLLMsTranslate full-length books and documents with Ollama, OpenAI-compatible, Gemini, Mistral, DeepSeek, Poe or OpenRouter. Preserves formatting. Resumes where you left off. No file size limits.项目地址: https://gitcode.com/gh_mirrors/tr/TranslateBooksWithLLMs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考