После нескольких часов исследования проблемы, вот с чем я столкнулся.
Для CSS - единственным решением, которое я нашел, было просто включить CSS в шаблоны HTML. Не элегантно, но делает работу (по крайней мере, пока). Не большая проблема, так как я использую эти шаблоны для создания PDF-файлов.
Но та же проблема была с файлами изображений, но эту проблему я смог решить элегантным способом. Вот оно!
Проблема заключалась в том, что в веб-контейнере Java не могла найти файлы, указанные в шаблонах .html.
Поэтому мне пришлось написать собственную фабрику элементов, расширяющую ReplacedElementFactory. вот код для этого:
public class B64ImgReplacedElementFactory implements ReplacedElementFactory {
public ReplacedElement createReplacedElement(LayoutContext c, BlockBox box, UserAgentCallback uac, int cssWidth, int cssHeight) {
Element e = box.getElement();
if (e == null) {
return null;
}
String nodeName = e.getNodeName();
if (nodeName.equals("img")) {
String attribute = e.getAttribute("src");
FSImage fsImage;
try {
fsImage = buildImage(attribute);
} catch (BadElementException e1) {
fsImage = null;
} catch (IOException e1) {
fsImage = null;
}
if (fsImage != null) {
if (cssWidth != -1 || cssHeight != -1) {
fsImage.scale(cssWidth, cssHeight);
}
return new ITextImageElement(fsImage);
}
}
return null;
}
protected FSImage buildImage(String srcAttr) throws IOException, BadElementException {
URL res = getClass().getClassLoader().getResource(srcAttr);
if (res != null) {
return new ITextFSImage(Image.getInstance(res));
} else {
return null;
}
}
public void remove(Element e) {
}
public void reset() {
}
@Override
public void setFormSubmissionListener(FormSubmissionListener listener) {
}
}
и сценарий использования при создании кода PDF-файла:
ITextRenderer renderer = new ITextRenderer();
SharedContext sharedContext = renderer.getSharedContext();
sharedContext.setReplacedElementFactory(new B64ImgReplacedElementFactory());
Пользовательский заменяющий элемент перехватывает все вхождения узлов 'img' и использует ClasLoader для получения пути к ресурсу, и на основе этого возвращается FSImage, и это то, что нам нужно.
Надеюсь, это поможет!