首页 > 解决方案 > IText 7,获取文本透明度(参考ExtGState)

问题描述

我有两个简单文本的 PDF。其中之一包含透明度。文本对象包含对具有透明度值的 ExtGState 的引用。 我怎样才能得到这个值?

有来自调试工具的图片(pdf apache pdfbox): 在此处输入图像描述

我找到了如何从资源中获取透明度值,但我不知道如何将它与某些文本匹配。

double value = document.getFirstPage()
        .getResources()
        .getPdfObject()
        .getAsDictionary(PdfName.ExtGState)
        .getAsDictionary(new PdfName("GS1"))
        .getAsNumber(PdfName.ca)
        .getValue();

我还有一个类,它实现IEventListener并获取有关 PDF 中文本的许多不同信息。

class TextRenderListener implements IEventListener {

 @Override
    public void eventOccurred(IEventData data, EventType type) {
        if (type.equals(EventType.RENDER_TEXT)) {
            TextRenderInfo textRenderInfo = (TextRenderInfo) data;
            CanvasGraphicsState canvasGraphicsState = textRenderInfo.getGraphicsState();

    ...
   }
 ...
}

但是 fillAlpha 和 strokeAlpha 总是 == 1.0,我找不到对 Resource ExtGstate 的任何引用

解析器:

new PdfDocumentContentParser(document).processContent(pageNumber, new TextRenderListener);

pdf:https ://filebin.net/34vm4sxl715oxy6z

标签: javapdfitextitext7

解决方案


您提到fillAlpha并且strokeAlpha始终等于1并且以前确实是这种情况,但是最近已修复此问题,并且该修复程序在当前7.1.11-SNAPSHOT版本的 iText 中可用。这是示例代码:

class TextRenderListener implements IEventListener {

    @Override
    public void eventOccurred(IEventData data, EventType type) {
        if (type.equals(EventType.RENDER_TEXT)) {
            TextRenderInfo textRenderInfo = (TextRenderInfo) data;
            float transparency = textRenderInfo.getGraphicsState().getFillOpacity();
            System.out.println(transparency);
        }
    }

    @Override
    public Set<EventType> getSupportedEvents() {
        return new HashSet<>(Collections.singletonList(EventType.RENDER_TEXT));
    }
}

对于您的文档,它将以下内容打印到控制台中(因此第一段文本不透明,第二段文本是透明的):

1.0
0.34902

要使用 SNAPSHOT 版本,您需要将以下 Maven 存储库添加到您的项目中:

<repositories>
  <repository>
    <id>itext-snapshot</id>
    <name>iText Repository - snapshots</name>
    <url>https://repo.itextsupport.com/snapshot</url>
  </repository>
</repositories>

推荐阅读