IText 7, получить прозрачность текста (ссылка на ExtGState) - PullRequest
1 голос
/ 20 марта 2020

У меня есть PDF с двумя простыми текстами. Один из которых содержит прозрачность. Текстовый объект содержит ссылку на ExtGState, которая имеет значение прозрачности. Как я могу получить это значение?

Есть изображение из инструмента отладки (pdf apache pdfbox): enter image description here

Я нашел как получить значение прозрачности из ресурса, но я не знаю, как сопоставить его с определенным текстом.

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

Parser:

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

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

1 Ответ

2 голосов
/ 21 марта 2020

Вы упоминаете, что 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...