Использование байтов InputStream может уменьшить объем памяти для foString до коэффициента 2 (char = 2 байта).
ByteArrayOutputStream изменяет размер во время своего заполнения, поэтому добавление предполагаемой потребности ускоряет работу и можетпредотвратить слишком большое изменение размера.
InputStream foReader = new ByteArrayInputStream(
foString.toString().getBytes(StandardCharsets.UTF_8);
foString.close();
final int initialCapacity = 160 * 1024;
ByteArrayOutputStream pdfWriter = new ByteArrayOutputStream(initialCapacity);
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, fopFactory.newFOUserAgent(),
pdfWriter);
TRANSFORMER_FACTORY.newTransformer().transform(new StreamSource(foReader),
new SAXResult(fop.getDefaultHandler()));
Лучше всего было бы изменить API:
public void generateFromFo(final String foString, OutputStream pdfOut) { ... }
Это может сделать ByteArrayOutputStream
лишним, и вы можете сразу перейти к файлу, URL или что-то еще.
У самого документа и сгенерированного PDF также есть проблемы:
- размеры изображений (но помните о более высоком разрешении отпечатков)
- некоторыеизображения могут быть хорошо векторизованы
- повторяющиеся изображения, как в заголовке страницы, должны быть сохранены один раз
- шрифты в идеале должны быть стандартными шрифтами, вторые лучшие встроенные подмножества (из используемых символов)
- XML может быть неоптимальным, очень повторяющимся