0

我正在使用 Itext,我需要提取 PDF 中特定标题的字体颜色,关于如何执行此操作的任何想法?

4

2 回答 2

1

在使用 iTextSharp(iText 的 .NET 端口)过去 6 个月后,我将尝试解释如何实现您想要的。虽然这不是一个准确的答案,但它很可能会引导您到一个可以做额外功课来实现它的地方。

PDF 格式保持内存中的“图形状态”,大致是一组指定当前颜色、笔粗细、线条样式等的值。所有渲染操作(包括文本渲染)都使用此图形状态来确定该操作将输出什么生产。例如,您可以将当前颜色设置为蓝色,然后画几条线,所有这些线都将是蓝色的。因此,您不必为每个线条绘制操作指定线条颜色。

对于着色,我们在图形状态中有两个变量:当前描边颜色和当前非描边颜色。描边颜色用于一维绘图,如线条、边框等(如果您使用过 GDI+,这大致是 System.Drawing.Pen),而非描边颜色用于 2D 操作,如填充(在GDI+,一个 System.Drawing.Brush)。我相信文本着色是使用非描边颜色完成的,因为字形是 2D 对象。

对,既然你知道了理论部分,这就是你需要做的。PdfContentStreamProcessor在 iText 源代码中定位类。在这里,您会发现PopulateOperators()列出了 iText 当前可以解析的所有运算符。与着色相关的操作符有很多,这里不能一一概括(详见PDF规范),总之CSandcs操作符设置当前的颜色空间(支持RGB、Grayscale、CMYK、 L*a*b 和其他)SCsc设置当前描边和非描边颜色的运算符。同样,关于设置颜色空间,然后根据您应该查看 PDF 规范文档的当前颜色空间解释描边和非描边颜色的值,有很多细节。此外,还有一些推送和弹出图形状态操作会使事情变得更加复杂。

简而言之,您需要添加对运算符的支持,包括CS, cs, G, g, RG, rg, K, k, SC, sc,SCNscn. 目前 iTextSharp 目前不支持它们中的大多数,因此您必须为它们中的每一个编写自己的类(实现IContentOperator接口)。

您可以从这里获得很多实施帮助。尽管这个人并没有详细地实现它(我可以说这将是很多工作,尤其是处理 PDF 支持的所有颜色空间),这应该给你一个很好的起点。

希望这可以帮助。

于 2012-12-23T08:54:17.280 回答
1

PDF Clown(原生 Java 和 .NET)支持文本样式信息提取(包括文本颜色和文本渲染模式)和几乎所有开箱即用的图形运算符(参见其代码库中的 TextInfoExtractionSample)。

这个开源/免费软件库具有多功能内容引擎(请参阅 ContentScanner 类),能够执行不同的任务,例如内容解析、内容提取、内容编辑、内容呈现和打印(目前最后一个部分开发)。

它的对象模型是丰富且有凝聚力的(只有 2 个基类管理所有逻辑:PdfObject位于原始低级 PDF 类型(如字典、数组、数字...)的根;PdfObjectWrapper位于专用高级的根级 PDF 实体(例如页面、注释、书签...)),反映了官方 PDF 规范而没有其古怪之处。

我是它的开发者,所以我可能会有偏见,但如果你想尝试一下,我建议你从 sourceforge.net 上的 SVN 存储库中查看,因为 0.1.2 版本(目前正在开发中)引入了很多增强功能在最后一个版本。

于 2012-12-24T03:35:19.770 回答