IText 7,获取文本透明度(参考ExtGState)

IText 7, get transparency of text (reference to ExtGState)

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

调试工具(pdf apache pdfbox)有图片:

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

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

我还有一个 class,它实现 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

你提到 fillAlphastrokeAlpha 总是等于 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>