使用java Itext获取字体颜色

时间:2012-12-21 13:42:55

标签: java pdf itext

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

2 个答案:

答案 0 :(得分:1)

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

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

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

是的,现在您已经了解了理论部分,这就是您需要做的事情。在iText源代码中找到PdfContentStreamProcessor类。在这里,您将找到列出iText当前可以解析的所有运算符的PopulateOperators()。有很多与着色相关的运算符,其细节无法在此总结(有关详细信息,请参阅PDF规范),但简而言之,CScs运算符设置了当前的颜色空间(所以支持许多,包括RGB,灰度,CMYK,L * a * b和其他)以及设置当前描边和非描边颜色的SCsc运算符。同样,关于设置颜色空间然后根据当前颜色空间解释描边和非描边颜色的值有很多细节,您应该看到PDF规格文档。此外,还有一些推送和弹出图形状态操作,可能会使事情进一步复杂化。

简而言之,您需要添加对运营商的支持,包括CScsGgRG,{{1} },rgKkSCscSCN。目前iTextSharp目前还不支持其中的大多数,因此您必须为每个类编写自己的类(实现scn接口)。

您可以从here获得大量实施帮助。虽然这个人没有详细实现它(我可以说它很多,特别是处理PDF支持的所有颜色空间),但这应该给你一个非常好的起点。

希望这有帮助。

答案 1 :(得分:1)

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

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

它的对象模型是丰富而有凝聚力的(只有2个基类管理所有逻辑: PdfObject 在原始的低位 - 级别PDF类型(例如字典,数组,数字......); PdfObjectWrapper 位于专用高级PDF实体的根目录(例如页面,注释,书签...)),镜像官方PDF规范没有它的怪癖。

我是它的开发人员,所以我可能有偏见,但是如果你想尝试一下,我建议你从sourceforge.net上的SVN存储库中查看,因为0.1.2版本(目前正在开发中)介绍比上一版本有很多改进。