【问题标题】:Get font color with java Itext使用 java Itext 获取字体颜色
【发布时间】:2012-12-21 13:42:55
【问题描述】:

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

【问题讨论】:

  • @PradeepSimha 像这样的简明问题并不需要提问者尝试过的东西,通常情况下。换句话说,在没有真正获得答案的情况下,OP 可以尝试的东西并不多。
  • 答案取决于标题是如何添加到 PDF 中的。 iText 并不是真正为此类任务创建的。
  • @PradeepSimha 我尝试探索 TextRenderInfo 并成功提取了字体族并计算了大小,但是在文档中找不到颜色:(
  • @KlasLindbäck 你有这方面的文献吗?我只发现 cmets 说这很难,但我还没有找到原因,
  • @Guevara 我在 iText 邮件列表中看到了解释(可在 nabble.com 上找到)。从 pdf 中提取信息的主要问题是有很多方法可以构建相同的输出。 pdf 可能是许多图像,或者标题可以(理论上)由每个字母一个文本段组成。文本提取工具是相当新的,它是为了提取文本而创建的(因为这是作者需要的)。

标签: java pdf itext


【解决方案1】:

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

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

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

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

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

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多