**概述:**本文介绍了 TX Text Control 真正的 WYSIWYG(所见即所得)模板系统所带来的独特优势,与传统的 PDF 生成系统(如 HTML 到 PDF 转换器或需要自定义编程的 PDF 库)相比,模板是可视化设计的,类似于 Microsoft Word。
TX Text Control是一款功能类似于 MS Word 的文字处理控件,包括文档创建、编辑、打印、邮件合并、格式转换、拆分合并、导入导出、批量生成等功能。广泛应用于企业文档管理,网站内容发布,电子病历中病案模板创建、病历书写、修改历史、连续打印、病案归档等功能的实现。
在文档处理应用程序中比较文档的策略有很多。最常见的方法之一是逐字比较文档的文本。这是一种简单有效的文档比较方法,但它确实有一些局限性。
当您在应用程序开发中接到创建 PDF 文档的任务时,您会进行研究并找到许多不同的工具来帮助您完成这项工作。当然,您可以尝试自己创建 PDF,方法是研究最新的 PDF 2.0 规范(ISO 32000:2:2020)的约 1000 页,其中包含有关 PDF 文件格式、渲染、加密和其他功能的所有技术细节。但让我们面对现实:这是一项巨大的时间投入,有整个公司都在处理此事(例如我们 - Text Control)。
第一步是确定要创建哪种类型的 PDF 文档,最重要的是要确定要创建多少个。当涉及到 PDF 创建过程所需的灵活性时,这一决定至关重要。决策过程中还应考虑许多其他方面。
- 您是否需要从头开始创建 PDF 或者您是否拥有可以重复使用的现有文档?
- 您需要创建多少种不同类型的文档(以及将来需要创建多少种不同类型的文档!)?
- 组织中的哪个角色应该能够对文档或模板进行更改,例如更改徽标?
仅这三个问题就可以开启一个完整的思考过程,即文档生成过程应该如何模块化和易于维护。
HTML 到 PDF 的转换
开发人员的一个非常普遍的想法是使用工具将 HTML 转换为 PDF。理由听起来很正确,因为作为开发人员,我们知道如何编写 HTML,并且对 HTML 和 CSS 样式充满信心。因此,此过程的基本思想是开发人员使用 CSS 创建 HTML,转换器根据该输入创建 PDF。流行的库包括 wkhtmltopdf、Puppeteer 和 Headless Chrome。
优点:
- 熟悉的标记:轻松创建 HTML 和 CSS。
- 动态内容:轻松创建动态内容。
- 快速结果:快速实施。
缺点:
- 不一致的渲染:由于渲染引擎对 HTML/CSS 的解释方式不同,HTML 到 PDF 转换器可能难以实现一致的布局和样式。
- 复杂布局: HTML 不是为打印精度而设计的,因此很难实现精确定位、对齐或特定于页面的布局(例如固定的页眉和页脚)。
- 性能:复杂或大型的 HTML 文档会减慢 PDF 创建过程。
对于简单文档或需要从网页创建 PDF 时,HTML 到 PDF 的转换是一个不错的选择。但是对于发票、报告或合同等复杂文档,HTML 到 PDF 转换器有其局限性。
程序化 PDF 生成
了解了 HTML 方法的局限性之后,使用一种能够更精确地定位元素的方法似乎是显而易见的。
程序化 PDF 创建是使用编程接口创建 PDF 文档的过程。这种方法更加灵活,允许您创建具有精确布局和样式的复杂文档。在您的代码中,您基本上将某些元素定位在页面上的 x 和 y 坐标上。
优点:
- 精细控制:页面上元素的精确定位。
- 定制:完全控制文档的布局和样式。
- 一致性:由于布局是编码的,因此平台之间出现不一致的风险较小。
缺点:
- 劳动密集型:开发人员必须手动定义和定位每个元素,这对于复杂的文档来说可能是一个耗时的过程。
- 需要编程技能:非技术用户无法创建或自定义模板,因此任何更改都需要开发人员的干预。
- 手动分页:开发人员必须明确处理分页符和溢出内容,这增加了编码过程的复杂性。
对于需要精确布局和样式的复杂文档,程序化 PDF 生成是一个不错的选择。但是,它可能非常耗时,并且需要编程技能来创建和维护模板。
以下代码片段使用 QuestPDF,这是一个用于创建 PDF 文档的开源 .NET 库。该代码基本上将文本添加到标题中,您已经可以看到这提供了一种灵活的方式,但所有元素都必须以编程方式定位,并且静态文本也嵌入到代码中。
void ComposeHeader(IContainer container)
{
var titleStyle = TextStyle.Default.FontSize(20).SemiBold().FontColor(Colors.Blue.Medium);
container.Row(row =>
{
row.RelativeItem().Column(column =>
{
column.Item().Text($"Invoice #{Model.InvoiceNumber}").Style(titleStyle);
column.Item().Text(text =>
{
text.Span("Issue date: ").SemiBold();
text.Span($"{Model.IssueDate:d}");
});
column.Item().Text(text =>
{
text.Span("Due date: ").SemiBold();
text.Span($"{Model.DueDate:d}");
});
});
row.ConstantItem(100).Height(50).Placeholder();
});
}
更高的维护和技术债务
由于程序化 PDF 中的布局逻辑嵌入在代码中,因此任何模板调整都需要更改代码,即使是微小的调整也是如此。这会导致:
- 设计变更的反馈循环更长。
- 依赖开发人员进行模板调整,限制灵活性。
- 维护成本更高,因为模板或业务规则的更新需要持续的开发时间。
基于模板的 PDF 生成
基于模板的系统允许用户直观地设计 PDF 模板,通常使用与文字处理器非常相似的拖放界面。此设置允许 WYSIWYG(所见即所得)设计,其中模板看起来与最终输出完全相同。
TX Text Control 不仅可用于从头开始编写 PDF(如第二种方法中所述),还可用于使用 WYSIWYG 模板的最灵活方法。TX Text Control 附带一个功能齐全、可自定义且可编程的文档编辑器,可集成到 Web 应用程序中,让非技术用户创建像素完美的模板。SDK 还提供了一个非 UI 引擎,可完全嵌入到采用此模板并将来自各种数据源的数据合并到模板中的应用程序中。
这个概念不仅让您能够为用户提供一个非常易于使用的模板创建界面,而且还为您在合并过程中提供充分的灵活性。
优点:
- 用户友好型设计:所见即所得的设计工具允许非开发人员轻松创建模板,从而让更广泛的用户可以使用。
- 动态且一致的布局:基于模板的系统自动管理分页符和内容溢出,确保一致的布局,而无需自定义代码。
- 高保真输出:用户可以准确地看到他们的文档的外观,从而减少了测试和修改的需要。
- MS Word 兼容性:可以从 Microsoft Word 导入和导出模板,从而轻松重复使用现有文档。
缺点:
- 学习曲线:开发人员需要学习如何将模板系统集成到他们的应用程序中。
TX Text Control 将强大的动态文档生成功能(如合并字段、重复和条件合并块)与易于使用的模板设计相结合。
以下代码使用 TX Text Control 加载预先设计的模板并将 JSON 数据合并到其中以创建像素完美的 PDF。
using TXTextControl.DocumentServer.Fields;
using (TXTextControl.ServerTextControl tx = new TXTextControl.ServerTextControl())
{
tx.Create();
TXTextControl.LoadSettings ls = new TXTextControl.LoadSettings()
{
ApplicationFieldFormat = TXTextControl.ApplicationFieldFormat.MSWord,
LoadSubTextParts = true
};
tx.Load("template.docx", TXTextControl.StreamType.WordprocessingML, ls);
using (TXTextControl.DocumentServer.MailMerge mailMerge =
new TXTextControl.DocumentServer.MailMerge())
{
var jsonData = System.IO.File.ReadAllText("data.json");
mailMerge.TextComponent = tx;
mailMerge.MergeJsonData(jsonData);
}
tx.Save("output.pdf", TXTextControl.StreamType.AdobePDF);
}
结论
每种方法都有不同的用途,选择方法通常取决于文档类型、布局复杂程度和可用的技术专长。TX Text Control 等解决方案具有所见即所得的设计和灵活的数据合并功能,提供了理想的折中方案,将模板设计的视觉简洁性与强大的 PDF 生成功能相结合。