Как создать аннотацию XFDF с изображением

Я хотел бы сгенерировать в Java XFDF Stamp Annotation, которая будет иметь прозрачное изображение внутри. У меня серьезные проблемы с распознаванием формата, в котором хранится изображение, и с тем, как преобразовать мое входное изображение в эту форму.

Пока знаю

  • Элемент штампа является дочерним элементом элемента annots и соответствует аннотации "Штамп". Аннотация "Штамп" отображает текст или графику, которые должны выглядеть так, как если бы они были выбиты на странице штампом. При наличии дочерний элемент внешнего вида (ключ AP в словаре аннотаций) имеет приоритет над атрибутом значка (ключ Name в словаре аннотаций штампов). Модель содержимого (Content-Richtext? & Content? & Внешний вид? & Popup?)
  • Элемент Внешний вид является дочерним элементом элемента штампа и соответствует ключу AP в словаре аннотаций. Значение представляет собой строку в кодировке Base 64. Модель содержимого Base 64, закодированная строка. Атрибуты Нет.

У меня есть пример XFDF, который содержит изображение, когда я декодирую изображение, я вижу такой синтаксис, но, к сожалению, я понятия не имею, какой тип необработанных данных присутствует в тег.

<DICT KEY="AP">
<STREAM KEY="N">
    <ARRAY KEY="BBox">
        <FIXED VAL="250"/>
        <FIXED VAL="550"/>
        <FIXED VAL="400"/>
        <FIXED VAL="575"/>
</ARRAY>
    <INT KEY="FormType" VAL="1"/>
    <INT KEY="Length" VAL="35"/>
    <DICT KEY="Resources">
        <DICT KEY="XObject">
            <STREAM KEY="Im1">
                <INT KEY="BitsPerComponent" VAL="8"/>
                <NAME KEY="ColorSpace" VAL="DeviceRGB"/>
                <NAME KEY="Filter" VAL="FlateDecode"/>
                <INT KEY="Height" VAL="150"/>
                <INT KEY="Length" VAL="1907"/>
                <STREAM KEY="SMask">
                    <INT KEY="BitsPerComponent" VAL="8"/>
                    <NAME KEY="ColorSpace" VAL="DeviceGray"/>
                    <NAME KEY="Filter" VAL="FlateDecode"/>
                    <INT KEY="Height" VAL="150"/>
                    <INT KEY="Length" VAL="5690"/>
                    <NAME KEY="Subtype" VAL="Image"/>
                    <NAME KEY="Type" VAL="XObject"/>
                    <INT KEY="Width" VAL="300"/>
                    <DATA MODE="RAW" ENCODING="HEX">

Мне удалось создать аннотацию резинового штампа с пользовательским изображением в PDF с помощью PDFBox, но, к сожалению, PDFBox, похоже, не поддерживает экспорт аннотаций такого типа в XFDF, они поддерживают только экспорт из форм (AcroForm). Я не знаю другого инструмента в Java, который позволил бы мне его экспортировать, кроме платных.

2 ответа

Решение

Это шестнадцатеричное представление формата DCT (JPEG). Если вам нужна печать с прозрачным изображением, у вас в XFDF будет две вещи: само изображение и маска.

Добавьте элемент штампа, который выглядит следующим образом:

<stamp creationdate="D:20200422160322Z" flags="print" date="D:20200422160322Z" icon="Unknown" page="0" rect="276.675,778.525,318.325,841">
  <imagedata>data:image/png;base64,iVBORw0 . . . FTkSuQmCC</imagedata>
  <apref y="841" x="276.675" gennum="2" objnum="198" />
</stamp>

Спецификации XFDF не объясняют, для чего предназначены эти теги. Думаю, они не учли важную часть информации.

Этот поток сэкономил мне время, чтобы выяснить, почему полученный образ base 64 не импортируется в Acrobat. Так что это XML XOjbect.

Может быть, спецификации PDF акробата упоминают об этом.

Другие вопросы по тегам