PDF/SVG格式转化工具 - 星外之神的博客 | wszqkzqk Blog

PDF/SVG格式转化工具 - 星外之神的博客 | wszqkzqk Blog

天下难事,必作于易;天下大事,必作于细

访问网站
我的收藏187 次访问更新于 a month ago反馈
PDF/SVG格式转化工具 - 星外之神的博客 | wszqkzqk Blog screenshot

详细介绍

简介

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.mdREADME-zh.md