Я пытаюсь «автоматизировать» создание 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 я пробовал несколько конфигураций, но ни одна из них не подходит для моих нужд:
Я сохранил файл FO и два изображения в одном каталоге и сослался на них, используя следующий конструктор FopFactory:
private static final FopFactory fopFactory = FopFactory.newInstance(new File("C:\\Temp\\FOP\\test").toURI());
Эта база кода находит только меньшее из два изображения. Похоже, что более крупный игнорируется, поскольку он превышает некоторый предел.
Я пробовал вышеуказанный конструктор, используя различные относительные и абсолютные пути.
- Я попытался создать FopFactory, используя файл по умолчанию «fop.xconf» и добавив каталог «C: \ Temp \ FOP \ Test» в путь к классам.
- Я «жестко запрограммировал» файлы и их местоположений в файле FO.
- Я пробовал использовать структуру промежуточных файлов (IFDocumentHandler, IFSerializer и IFConcatenator) для изображений и получаю таким образом ошибки. Кажется, промежуточные файлы не предназначены для изображений.
Мне удалось встроить файл в файл FO, используя кодировку base64 и синтаксис:
<fo:external-graphic src="url('data:image/png;base64,iVBORw...ggg==')"/>
Последний вариант кажется лучшим решением, кроме трех источников и использования всех трех для создания PDF. Есть предложения по использованию API для объединения трех источников?
Спасибо.