Apache FOP и Java Проблемы с изображением - объединение нескольких источников - PullRequest
1 голос
/ 18 июня 2020

Я пытаюсь «автоматизировать» создание PDF-файла с помощью Apache FOP и Java. Я хочу свести к минимуму жесткое кодирование, так как я заранее не знаю все комбинации файлов, которые мне понадобятся. Вдобавок я хочу попробовать не сохранять файлы на жестком диске. Файлы на HD представляют соображения безопасности, производительности, потоковой передачи и очистки, которые я бы предпочел не обрабатывать.

Тестовый пример, который я сейчас использую, имеет 1 FO и 2 PNG файла. Один из файлов PNG превышает 1 МБ.

В идеале я бы создал 3 источника:

InputStream fo = new InputStream(new File("C:\\Temp\\FOP\\Test\\blah.fo"));
InputStream png1 = new InputStream(new File("C:\\Temp\\FOP\\Test\\image-1.png"));
InputStream png2 = new InputStream(new File("C:\\Temp\\FOP\\Test\\image-2.png"));
Source foSrc = new StreamSource(fo);
Source png1Src = new StreamSource(png1);
Source png2Src = new StreamSource(png2);

, а затем объединил их все вместе для создания PDF. Я не могу найти способ сделать это с помощью API.

Файлы FO ссылаются на изображения через:

<fo:external-graphic src="file:image-1.png"/>
<fo:external-graphic src="file:image-2.png"/>

Когда я использую инструменты командной строки FOP, он создает PDF, как я и ожидал. Пока два изображения находятся в том же каталоге, что и файл FO, все в порядке. Используя командную строку, нет необходимости указывать на существование или расположение изображений.

При использовании Java я пробовал несколько конфигураций, но ни одна из них не подходит для моих нужд:

  1. Я сохранил файл FO и два изображения в одном каталоге и сослался на них, используя следующий конструктор FopFactory:

    private static final FopFactory fopFactory = FopFactory.newInstance(new File("C:\\Temp\\FOP\\test").toURI());
    

    Эта база кода находит только меньшее из два изображения. Похоже, что более крупный игнорируется, поскольку он превышает некоторый предел.

  2. Я пробовал вышеуказанный конструктор, используя различные относительные и абсолютные пути.

  3. Я попытался создать FopFactory, используя файл по умолчанию «fop.xconf» и добавив каталог «C: \ Temp \ FOP \ Test» в путь к классам.
  4. Я «жестко запрограммировал» файлы и их местоположений в файле FO.
  5. Я пробовал использовать структуру промежуточных файлов (IFDocumentHandler, IFSerializer и IFConcatenator) для изображений и получаю таким образом ошибки. Кажется, промежуточные файлы не предназначены для изображений.
  6. Мне удалось встроить файл в файл FO, используя кодировку base64 и синтаксис:

    <fo:external-graphic src="url('data:image/png;base64,iVBORw...ggg==')"/>
    

Последний вариант кажется лучшим решением, кроме трех источников и использования всех трех для создания PDF. Есть предложения по использованию API для объединения трех источников?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...