简介
PDF/SVG 格式转化工具是由星外之神(wszqkzqk)开发并发布于个人博客的开源命令行工具,项目代码托管在 GitHub,采用 LGPL v2.1+ 协议公开。该工具基于 Cairo、Poppler 和 Rsvg 开发,使用 Vala 语言编写,配合 Meson 构建系统,实现了高效、多线程的 PDF 与 SVG 格式互转,避免了传统工具(如 ImageMagick)光栅化导致矢量信息丢失的问题,并补足了 pdf2svg 等功能单一的不足。
主要功能
项目提供两个核心命令行工具:
- PDF to SVG(pdf2svg):将 PDF 文件转化为 SVG 文件。支持多线程处理、加密 PDF 解密、指定页码或页码范围转化,以及使用 printf 风格格式化标识符生成带序号的输出文件名(如
output-%03d.svg 生成 output-001.svg 等)。
- SVG to PDF(svg2pdf):将一组 SVG 文件按顺序合并生成单个 PDF 文件。
通用辅助特性:
- 自研日志输出模块,支持彩色日志与彩色进度条显示,展示成功/失败统计及百分比进度。
- 跨平台终端支持模块(platformbindings),获取终端宽度、判断文件描述符类型等。
- 构建脚本(meson.build)支持通过
vcs_tag 生成版本信息,并可选择性生成 manpage。
基本原理
- PDF 转 SVG:利用 Poppler 解析 PDF 页,将内容渲染到 Cairo 的
SvgSurface 上,通过 Cairo Context 绘制生成 SVG。
- SVG 转 PDF:利用 Rsvg 解析 SVG,绘制到 Cairo 的
PdfSurface 上,合并为 PDF。
为避免 Poppler 渲染不支持多线程的问题,PDF 转 SVG 的多线程模式下每个线程重新打开 PDF 文档建立独立对象,确保线程安全。
适用场景
- 需要将矢量 PDF 无损转为 SVG 以保留矢量信息,或反向将多张 SVG 合并为 PDF 的用户。
- 处理多页、加密 PDF 并希望利用多线程加速转换的场景。
- 命令行环境下追求轻量、高效格式转换工具的 Linux(含 Arch AUR)及 Windows(MSYS2)用户。
- 学习 Vala / Cairo 编程、参考模块化与多线程设计的开发者。
特点
- 多线程与线程安全:每线程独立打开 PDF,规避竞争与崩溃。
- 用户友好:OptionContext 解析参数,可动态调整日志颜色、线程数,提供帮助与版本信息。
- 跨平台:依赖库与 Vala 均多平台支持,适配不同 OS 终端功能。
- 模块化:日志、任务、渲染、构建分离,易维护扩展。
构建与运行
项目已上传至 Arch Linux AUR,并适配 Windows (MSYS2) 的 PKGBUILD 构建脚本。具体构建与运行步骤参见项目 README.md 或 README-zh.md。