css файл не найден тимилефом - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь сделать простой сервлет, который генерирует PDF-файл на основе шаблона HTML.Я пытаюсь использовать Thymeleaf и FlyingSaucer, как в примере

в моем template.hmtl У меня есть стиль delcaration следующим образом:

<link rel="stylesheet" type="text/css" media="all" href="style.css"/>

он никогда не загружается.Нет ошибок, ничего, только в результате. PDF не хватает стиля.Если я помещаю содержимое файла стиля в template.HTML, оно работает как шарм.

Если я добавляю что-то вроде этого:

<link rel="stylesheet" type="text/css" media="all" href="http://localhost:8080/MY_APP/resources/style.css"/>

, оно работает.

Все мои ресурсынаходятся под src/main/webapp/resources.

1 Ответ

0 голосов
/ 27 марта 2019

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

Для 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, и это то, что нам нужно.

Надеюсь, это поможет!

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