java - 使用java Itext获取字体颜色

标签 java pdf itext

我正在使用 Itext,需要提取 PDF 中特定标题的字体颜色,您知道如何执行此操作吗?

最佳答案

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

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

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

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

简而言之,您需要添加对运算符的支持,包括 CScsGg >、RGrgKkSC scSCNscn。目前 iTextSharp 尚不支持其中大多数,因此您必须为每个类编写自己的类(实现 IContentOperator 接口(interface))。

您可以从 here 获得大量实现帮助。虽然这个人没有实现它的所有细节(我可以说这将是大量工作,特别是处理 PDF 支持的所有颜色空间),但这应该为您提供一个非常好的起点。

希望这有帮助。

关于java - 使用java Itext获取字体颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13991262/

相关文章:

java - Eclipse在android中步入类

java - 将 Flux<Document> 转换为 Flux<Object> 或 List<Object>

java - 在对象中搜索关键字

python - PDFMiner - 遍历页面并将它们转换为文本

java - 在 Java 中加密/解密 "AES/ECB/PKCS5Padding"

pdf - Prestashop : PDF invoice uses a different font depending on the language (French vs. 英文)

pdf-generation - 如何从 "complex"XML 文件创建标记的 PDF

java - 使用 itext 4 编辑 pdf 中的现有超链接

java - DIV 高度在 pdfhtm iText 中不起作用?

pdf - 从 PDF 文件中删除打印机标记