Начнем с того, что стандарт pdf ISO 32000-2 вообще не определяет «поля изображения». Некоторые проприетарные pdf-генераторы / редакторы (в частности, продукты Adobe) используют JavaScript, чтобы поля кнопок работали аналогично полям форм для изображений в графическом интерфейсе, в частности в своих собственных средствах просмотра PDF. Тем не менее эти кнопки являются кнопками, а не полями формы изображения. Таким образом,
PDFBox рассматривает такое поле как экземпляр PDPushButton
, но я не вижу, чтобы интерфейс этого класса предоставлял методы для работы с изображениями ...
Если вам действительно нужно что-то вроде поля изображения, тем не менее, нет необходимости искать другое решение для эмуляции полей изображения, можно просто последовать примеру Adobe. Нужно просто знать, что только эмулирует полей изображения.
Чтобы заполнить поле кнопки изображением, можно использовать AcroFormPopulator
Ренат Гатин представляет в свой ответ на свой вопрос "Как вставить изображение программно в поле AcroForm, используя java PDFBox? ".
Осторожно, однако, применительно к вашему файлу с примерами обнаруживается ошибка в коде выравнивания формы PDFBox. Таким образом, вы должны деактивировать сплющивание формы в AcroFormPopulator
, т.е. удалить в нем acroForm.flatten()
.
Данная ошибка связана с отсутствующим преобразованием: если XObject используется как внешний вид поля формы, все в его ограничительной рамке по спецификации автоматически перемещается в прямоугольник аннотации:
1. Ограничительная рамка внешнего вида (указанная в ее записи BBox ) должна быть преобразована с использованием Matrix , чтобы получить четырехугольник с произвольной ориентацией. Преобразованная коробка внешнего вида - это наименьший вертикальный прямоугольник, охватывающий этот четырехугольник.
2. Должна быть рассчитана матрица A , которая масштабирует и преобразует преобразованную рамку внешнего вида в соответствие с краями прямоугольника аннотации (указанной в записи Rect ). A отображает левый нижний угол (угол с наименьшими x и y координатами) и верхний правый угол (угол с наибольшим x и y координаты) преобразованного окна внешнего вида в соответствующие углы прямоугольника аннотации.
3. Матрица должна быть объединена с A для формирования матрицы AA , которая отображается из системы координат внешнего вида в прямоугольник аннотации в пользовательском пространстве по умолчанию
(ISO 32000-2, раздел 12.5.5 Потоки внешнего вида, Алгоритм: потоки внешнего вида)
Когда на упомянутый объект XObject после выравнивания ссылаются из содержимого страницы, это преобразование AA больше не определяется и автоматически применяется средством просмотра, поэтому оно должно быть явно добавлено средством выравнивания формы.
Видимо, выравнивание формы PDFBox, по крайней мере, не создает эту матрицу AA , в частности, предполагается, что ограничивающий прямоугольник внизу слева всегда будет в начале координатной системы.
Для вашего примера PDF это не тот случай, поэтому сглаживание здесь эффективно выводит кнопку сглаженного поля изображения за пределы экрана.
PS: Ситуация даже более странная, чем ожидалось, PDAcroForm.flatten(List<PDField>, boolean)
пытается определить, необходим ли перевод или масштабирование прежнего внешнего вида XObject, и добавляет преобразование, если считает, что это необходимо, но
1. при проверке необходимости перевода в PDAcroForm.resolveNeedsTranslation(PDAppearanceStream)
он фактически проверяет ресурсы формы XObject внешнего вида XObject; в том и только в том случае, если среди них есть объект XObject с ограничительной рамкой, в которой ни одна из опорных координат не равна 0, предполагается, что перевод не требуется. - Это очень странный тест, правильный тест должен был бы проверить ограничивающий прямоугольник самого XObject внешнего вида, а не формы XObject, которые он содержит. В примере документа внешний вид XObject не содержит никаких форм XObject, поэтому автоматически предполагается, что требуется перевод.
2. при добавлении трансляционного преобразования он снова игнорирует ограничивающий прямоугольник внешнего вида XObject и переводит, как если бы якорь внешнего вида XObject находился в начале координат системы координат. - В образце документа это совершенно неадекватно, так как якорь ограничивающего прямоугольника уже расположен так далеко, что приводит к его перемещению в два раза на требуемое расстояние от источника.
3. при проверке необходимости перевода в PDAcroForm.resolveNeedsScaling(PDAppearanceStream)
он фактически проверяет наличие произвольных XObject-ов и предполагает, что при наличии такого XObject-а требуется масштабирование. - В примере документа есть изображение XObject, поэтому предполагается, что масштабирование необходимо ... странно.
Эти 3 детали не имеют никакого смысла вообще. (Ну, возможно, были некоторые образцы документов, для которых они случайно дали желаемый результат, но в целом это чепуха.)