chromium_third_party_pdfium:基于 Chromium 技术的 PDF 渲染引擎项目

PDF 渲染引擎

分支91Tags1
文件最后提交记录最后更新时间
8 个月前
7 个月前
1 天前
3 年前
15 天前
5 个月前
15 天前
1 年前
5 个月前
2 年前
5 个月前
15 天前
21 天前
2 年前
21 天前
1 年前
2 年前
7 个月前
11 个月前
3 年前
2 年前
8 个月前
8 个月前
3 年前
7 个月前
1 年前
3 年前
1 年前
1 年前
2 年前
3 年前
1 年前
2 年前
3 年前
8 个月前
7 个月前

PDFium

前提条件

PDFium 使用与 Chromium 相同的构建工具。请参阅特定平台的 Chromium 构建说明以开始操作,但需将 Chromium 的“获取代码”说明替换为 PDFium 的说明

支持的 CPU 架构

Windows、Linux 和 Mac 的默认架构为“x64”。在 Windows 上,“x86”也受支持。可使用 GN 参数“target_cpu = "x86"”覆盖默认值。如果指定 Android 构建,默认 CPU 架构将为“arm”。

预计代码中仍有部分地方在大端序架构上无法正常运行。欢迎报告错误和/或提交补丁,但是目前提供此支持并非优先事项。

支持的编译器

PDFium 旨在符合 Chromium 政策

目前这意味着支持 Clang。以前使用 MSVC 的用户如需继续使用,可考虑使用 clang-cl。社区贡献的 gcc 补丁将被允许。不接受 MSVC 补丁。

Google 员工

运行:download_from_google_storage --config 并按照身份验证说明进行操作。请注意,您必须使用 @google.com 凭据进行身份验证。如果被问及项目 ID,请输入“0”。

完成此步骤后,工具链将在下面的生成构建文件步骤中自动为您安装。

工具链将位于 depot_tools\win_toolchain\vs_files\<hash>,windbg 可在 depot_tools\win_toolchain\vs_files\<hash>\win_sdk\Debuggers 中找到。

如果您需要用于调试和编辑的 IDE,则需要单独安装,但这是可选的,构建 PDFium 不需要此步骤。

获取代码

顶级目录的名称无关紧要。在以下示例中,目录名称为 “repo”。此目录之前不得被 gclient config 使用过,因为每个目录只能包含一个 gclient 配置。

mkdir repo
cd repo
gclient config --unmanaged https://pdfium.googlesource.com/pdfium.git
gclient sync
cd pdfium

在 Linux 上,需要通过从 pdfium 目录运行以下命令来安装额外的构建依赖项。

./build/install-build-deps.sh

生成构建文件

PDFium 使用 GN 生成构建文件,并通过 Ninja 执行构建文件。这两个工具均包含在 depot_tools 检出内容中。

选择构建配置

PDFium 可以选择启用或禁用 JavaScript 支持,以及启用或禁用 XFA 表单支持。这两项功能默认均为启用状态。请注意,XFA 功能依赖 JavaScript。

通过执行 gn args <directory> 命令进行配置,这将启动编辑器,您可以在其中设置以下参数。按照惯例,<directory> 应命名为 out/foo,部分工具/测试支持代码仅在遵循此惯例时才能正常工作。典型的 <directory> 名称为 out/Debug

use_remoteexec = false # Approved users only.  Do necessary setup & authentication first.
is_debug = true  # Enable debugging features.

# Set true to enable experimental Skia backend.
pdf_use_skia = false

# Set true to enable experimental Fontations backend.
pdf_enable_fontations = false

pdf_enable_xfa = true  # Set false to remove XFA support (implies JS support).
pdf_enable_v8 = true  # Set false to remove Javascript support.
pdf_is_standalone = true  # Set for a non-embedded build.
is_component_build = false # Disable component build (Though it should work)

为了让 pdfium_test 等测试应用能够构建,必须设置 pdf_is_standalone = true

默认情况下,整个项目使用 C++20 构建。

默认情况下,PDFium 期望使用提供额外 chrome 插件的 clang 编译器进行构建。若要使用缺少这些插件的普通 clang 编译器进行构建,必须设置 clang_use_chrome_plugins = false

完成后,参数将存储在 <directory>/args.gn 中,GN 将自动使用这些新参数生成构建文件。如果文件生成失败,请仔细检查是否已按上述说明设置 use_sysroot。

构建代码

你可以通过运行以下命令构建独立测试程序: ninja -C <directory> pdfium_test 你可以通过运行以下命令构建整个产品(包括一些单元测试): ninja -C <directory> pdfium_all

运行独立测试程序

pdfium_test 程序支持读取、解析 PDF 文件的页面,并将其光栅化为 .ppm 或 .png 输出图像文件(Windows 支持另外两种格式)。例如:<directory>/pdfium_test --ppm path/to/myfile.pdf。请注意,这会将输出图像写入 path/to/myfile.pdf.<n>.ppm。运行 pdfium_test --help 以查看所有选项。

测试

目前有几个可以运行的测试套件:

  • pdfium_unittests
  • pdfium_embeddertests
  • testing/tools/run_corpus_tests.py
  • testing/tools/run_javascript_tests.py
  • testing/tools/run_pixel_tests.py

由于不同平台上的字体差异,testing 目录中的测试可能会失败。这些测试在自动化构建机上是可靠的。如果你遇到失败,在最新代码 checkout 上运行测试,看看是否出现相同的失败,这可能是个好主意。

像素测试

如果你的更改影响渲染,则应添加像素测试。只需在 testing/resources/pixel 中添加一个 .in.pdf 文件,像素测试运行器将在下次运行时自动检测到它。

确保你的测试用例没有任何版权问题。它还应该是一个最小化的测试用例,专注于在许多 PDF 查看器中以相同方式呈现的 bug。尽量避免流中的二进制数据,使用 ASCIIHexDecode,因为这会使 PDF 在文本编辑器中更具可读性。

要试用你的新测试,你可以调用 run_pixel_tests.py 脚本:

$ ./testing/tools/run_pixel_tests.py your_new_file.in

要生成预期图像,您可以使用 make_expected.sh 脚本:

$ ./testing/tools/make_expected.sh your_new_file.pdf

请确保已安装 optipng,它可以优化生成的 png 文件大小。

.in 文件

.in 文件是 PDF 模板文件。PDF 文件包含许多字节偏移量,这些偏移量必须保持正确,否则文件将无效。模板通过用特定关键字替换字节偏移量,使这一过程变得更加简单。

这样做不仅节省空间,还提供了一种将测试用例精简到最基本要素的简便方法,您只需删除所有非必要内容即可。

简单示例可在此处找到:here

要将其转换为 PDF,您可以使用 fixup_pdf_template.py 工具:

$ ./testing/tools/fixup_pdf_template.py your_file.in

这将在 your_file.in 所在的同一目录中创建一个 your_file.pdf

目前没有针对 .in 文件的官方样式指南,但为了提高可读性,建议保持一致的样式。如果可能,对象编号应连续,并且 /Type/SubType 应位于字典的顶部,以便更轻松地识别对象。

在您自己的项目中嵌入 PDFium

public/ 目录包含可供 PDFium 嵌入者使用的 API 头文件。PDFium 项目致力于保持这些 API 的稳定性。

在 public/ 目录之外,代码可能随时发生变化,嵌入者不应直接调用这些例程。

代码覆盖率

可以在 Linux 开发环境中生成 PDFium 的代码覆盖率报告。详细信息可参见此处

Chromium 提供了 PDFium 的代码覆盖率报告,可通过此处访问。在 Chromium 的源代码中,PDFium 位于 third_party/pdfium。这包括来自 PDFium 模糊测试器的代码覆盖率。

持续构建状态(Waterfall)

源代码树的当前健康状态可在此处查看。

社区

已建立了多个邮件列表:

请注意,代码审查和缺陷列表通常是只读的。

缺陷

PDFium 使用此缺陷跟踪器,但对于安全缺陷,请使用Chromium 的安全缺陷模板

代码贡献

有关为 PDFium 项目贡献代码的更多信息,请参见CONTRIBUTING文档。