У меня есть проект, в котором мне нужно создать файл PDF. В этот PDF-файл мне нужно вставить основной текст, а также четыре или пять больших изображений (примерно 800 пикселей * 1000 пикселей). Чтобы сделать это гибким, я решил использовать FreeMarker в сочетании с XHTMLRenderer (летающая тарелка).
Теперь я столкнулся с несколькими вариантами:
- Создайте изображения и сохраните их как временные файлы на диск. Затем обработайте шаблон
.xhtml
с помощью FreeMarker (сохранив его на диск) и передайте обработанный URL-адрес файла.xhtml
в XHTMLRenderer для создания PDF-файла. Все эти созданные файлы (за исключением PDF) будут созданы с помощьюFile.createTempFile
. Это позволит FreeMarker брать изображения с диска (как если бы они были изображениями, связанными в XHTML). - Обработайте шаблон
.xhtml
и сохраните его в памяти. Передайте изображения в шаблон как URL-адреса данных в кодировке base64. Это избавило бы от необходимости сохранять какие-либо временные файлы, поскольку выходные данные FreeMarker можно было бы передавать непосредственно в XHTMLRenderer.
Пример URL-адреса изображения в кодировке Base64 (маленький значок папки):
<img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0jvb29t/f3//Ub/
/ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAARe8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExK
cppV0aCcGCmTIHEIUEqjgaORCMxIC6e0CcguWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" />
Мой главный вопрос: какая техника лучше? Является ли создание большого количества временных файлов плохим (это влечет за собой много накладных расходов)? Могу ли я потенциально исчерпать память, создавая такие большие строки в кодировке base64?