Libre Office 标签在 iTextSharp 中不显示为“AcroFields”?

Posted

技术标签:

【中文标题】Libre Office 标签在 iTextSharp 中不显示为“AcroFields”?【英文标题】:Libre Office Labels don't show up as "AcroFields" in iTextSharp? 【发布时间】:2019-03-13 13:38:51 【问题描述】:

所以我一直在尝试生成报告。我已经尝试了很多东西,但似乎总是有问题。我目前正在尝试 iTextSharp 4.1.6。

我目前的策略是使用 LibreOffice 创建一个带有可编辑 pdf 字段的文档,或者我猜它们被称为“AcroFields”。我不确定,因为我找不到定义。但无论如何,我认为所有这些都是“AcroFields”:

但如果我将所有这些都放入一个表单并导出为 pdf,则只有其中一些显示为 AcroFields:

var reader = new PdfReader(File.ReadAllBytes("abc.pdf"));
foreach(var field in reader.AcroFields.Fields)

    Console.WriteLine(((DictionaryEntry)field).Key);


> Text Box 1
  Check Box 1
  Numeric Field 1
  Formatted Field 1
  Date Field 1
  List Box 1
  Combo Box 1
  Push Button 1
  Option Button 1

注意Label Field 1 是如何不存在的。如果它存在,那么进行文本替换可能很容易。除非它不存在,所以看起来即使 iText 也无法在 pdf 中进行简单的文本替换。这是真的?如何使用 iTextSharp 替换 pdf 文档中的文本?

【问题讨论】:

【参考方案1】:

请注意标签字段 1 是如何不存在的。

由于没有AcroForm表单字段类型“标签”,因此表单标签通常被绘制为PDF文件中的常规页面内容。

如果它存在,那么进行文本替换可能会很容易。除非它不存在,所以看起来即使 iText 也无法在 pdf 中进行简单的文本替换。这是真的吗?

确实,一般来说,PDF 中没有简单的文本替换。

如何使用 iTextSharp 替换 pdf 文档中的文本?

我将使用 iText 文本提取功能和一些返回文本加坐标的扩展来确定要替换的文本的边界框坐标。然后我会使用 iText 的 PdfCleanUp... 类通过编辑删除该文本。最后,我会将替换文本作为新文本添加到开始时确定的边界框中。

很遗憾,您的 4.1.6 版中不存在良好的文本提取和编辑功能;对于这种方法,您应该至少更新到 5.5.x。

不过,如果您一直在尝试生成报告,我假设模板设计掌握在您手中。在这种情况下,您可以将标签放入您可以更改的只读文本字段中(它们对 GUI 用户是只读的)。

【讨论】:

我在任何地方都找不到 AcroField 类型的列表。 4.1.6 是最新的免费版本,所以这对我来说可能是 iTextSharp 的终点。但是,您知道我是否这样做了,它会包装文本(并更新文档以反映包装)还是仅将 g.DrawString 放在 pdf 顶部?使用只读文本框是不可行的,因为这看起来很糟糕。是的,我一直在尝试生成报告。我唯一不会生成看起来很糟糕的报告的可行解决方案是使用 OpenXML 进行编辑,然后使用 LibreOffice 命令行参数转换为 PDF。 除了在 Web 服务器上引入各种安全问题。我可以使用使用无头 webkit 生成 PDF 的工具获得不错的 html->pdf 转换,但这些都是命令行。 “最新的免费版”——那个free/not free分割很黑白;旧版本和新版本都在特定条件下免费为您提供库。 AGPL 之前的义务似乎要求不高,但 AGPL 的义务也可以履行并且可以被认为是公平的。 “你确定它可以免费使用吗?在 github 上他们说你必须在商业应用程序中使用它时立即购买它。” - 如果你使用 iText在 AGPL 下,您基本上必须向与程序接触的每个人提供对源代码的访问权(不仅是运行您的程序的人,还包括那些从中检索输出 PDF 的人);对于仅在单个组织内使用的应用程序,这可能没问题。此外,您始终可以通过对软件的咨询和支持来建立商业商业模式。所以他们在 github 上说的有些简化了。 “那么有一个ColumnText 会触发重排吗?” - ColumnText 会在确定的边界框内正确布局您的新文本,包括换行符等. 不过,它不会更改任何外部现有内容。

以上是关于Libre Office 标签在 iTextSharp 中不显示为“AcroFields”?的主要内容,如果未能解决你的问题,请参考以下文章

[Libre|Open]Office 中当前文档的路径

在 Open/Libre/Neo Office 中查找文本选择中的段落的宏

在 Libre Office Writer 中导入 BibTex 库?

如何在 Libre/Open Office 中使用 pyUNO 库检查段落调整?

Libre Office,清理范围

如何避免连接器在 Open Office/Libre Office Draw 中移过形状