Skip to content

pdf2zh 翻译逻辑: mustMarshal 手写 JSON + SSE 并发写 + 其他小问题 #71

@bruceding

Description

@bruceding

问题

pdf_translate.go 中有以下几个问题:

1. mustMarshal 手写 JSON 序列化有缺陷 (严重)

  • 只替换 "\",没处理 \n\t\r 等控制字符,消息含换行时会破坏 SSE data: 行格式
  • uint 类型(如 DocID)没被 switch 覆盖,走 default%v 输出
  • 应直接用 json.Marshal 替代手写实现

2. SSE 并发写不安全 (严重)

stdout goroutine、stderr goroutine 和主线程 cmd.Wait() 后的完成事件都在并发调用 c.Response().Write() + Flush()。echo 的 Response Writer 不是线程安全的,并发写可能导致 SSE 数据交错或损坏。

建议用 mutex 保护 Write+Flush,或用 channel 收集消息由单一 goroutine 写出。

3. shell 拼接命令有注入风险 (低)

cmdStr := fmt.Sprintf("source '%s/bin/activate' && pdf2zh --service openai '%s'", pdf2zhVenv, sourcePdf)

sourcePdf 路径含单引号时可以逃逸。实际概率低(路径由系统生成),但可以改用 exec.Command 直接调 venv 中的 pdf2zh 二进制,避免 shell 拼接。

4. filterPDF2ZhOutput 冗余匹配 (低)

if strings.Contains(lower, "converting") || strings.Contains(lower, "converting pdf") {

"converting pdf" 已被 "converting" 匹配,后者冗余。

5. 未传语言方向参数 (低)

pdf2zh 支持 --lang-in / --lang-out 参数,当前命令只传 --service openai,语言方向完全依赖 pdf2zh 自动检测。如果源文档语言判断不准,翻译方向可能出错。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions