福昕 PDF SDK 多线程安全使用指南
概述
自 v10.0 起,福昕 PDF SDK 引入内置线程安全机制;增强了 LibreOffice 转 PDF 多线程支持;从 v11.0 起,进一步增强了文档级多线程支持能力,尤其在 JavaScript、XFA、文档级对象方面。 为确保 SDK 在多线程环境中稳定高效运行,开发者仍需遵循特定的使用规范和初始化流程。
线程安全机制
1. 合规性引擎线程安全
- 版本要求:从 v10.0 版本开始,compliance 资源文件提供了默认的线程安全机制
- 初始化要求:对于多线程使用,必须在每个新线程开始前,首先调用
ComplianceEngine.initializeThreadContext
API - 使用顺序:初始化线程上下文后,才能安全使用合规性插件模块的其他接口
2. Office 转 PDF 多线程支持
- Linux平台:在Linux x86/x64架构下,提供专用的 LibreOffice 二进制程序支持多线程转换
- 实现方式:将对应架构的专用二进制引擎路径赋值给
engine_path
参数即可启用多线程转换
Java 示例:
java
String engine_path = "/resource-folder/x64/fxoffice2pdf"; // 请替换为正确的引擎路径。
Convert.fromWord(word_file_path, "", output_path, engine_path, word_convert_setting_data);
3. JavaScript 和 XFA 线程安全
- 版本要求:从 v11.0.0 版本开始, SDK 增强了 JavaScript 和 XFA 的线程安全处理
- 初始化要求:对于线程安全处理机制, 调用
Library::Initialize()
重载版本,设置参数bool enable_js_xfa_threadsafety
为true
4. 文档级别线程安全
- 架构改进:v11.0.0 版本对整体架构进行了改进,增强了文档级别的线程安全
- 核心规则:一个PDF文档仅支持在一个线程中处理,确保文档操作的数据一致性和安全性
平台限制
MacOS 平台限制 (Java)
- 不支持多线程:Mac Java 语言库目前不支持多线程操作
- 资源替换要求:需将资源包中
var\legacy
目录下的pdfEngineLight.dylib
文件复制到compliance/mac
多线程使用注意事项 (以 Java 为例)
💡 详细的 Java 对象释放机制可参考 福昕 PDF SDK Java 对象管理。
1. 初始化顺序(必须先初始化线程上下文)
java
// 正确的多线程初始化顺序
ComplianceEngine.initializeThreadContext(); // 必须先调用
// 然后才能使用其他合规性接口
2. 对象管理
- 手动释放 GSDK 对象:务必通过
.delete()
方法释放对象,避免内存泄漏 - 释放顺序:先释放子对象,再释放父对象
- 不依赖 GC:Java 的垃圾回收机制不会自动释放底层 C++ 对象,必须手动管理
示例
java
PDFDoc doc = new PDFDoc("sample.pdf");
doc.load(null);
PDFPage page = doc.getPage(0);
Annot annot = page.addAnnot(Annot.e_Link, rectF);
Link link = new Link(annot);
// 推荐释放顺序
link.delete(); // 子对象
annot.delete(); // 注释对象
page.delete(); // 页面对象
doc.delete(); // 文档对象