HTML в PDF с использованием внешнего CSS iText

Я использую летающую тарелку для рендеринга некоторых PDF-документов из строк в HTML.

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputStream is = new ByteArrayInputStream(html.getBytes("UTF-8"));
Document doc = builder.parse(is);

response.setContentType("application/pdf; charset=UTF-8");
response.setHeader("Content-disposition", "inline; filename=\"" + outFileName + "\"");

OutputStream os = response.getOutputStream();

ITextRenderer iTextRenderer = new ITextRenderer();
iTextRenderer.setDocument(doc,null);
iTextRenderer.layout();
iTextRenderer.createPDF(os);
os.flush();
os.close();

Это отлично работает, когда у меня есть простой текст. Я ссылался на внешний CSS в своем HTML-содержимом. Но когда создается PDF-файл, CSS не применяется.

Я читал, что метод setDocument() принимает два параметра: документ и URL. Параметр url указывает базовый URL-адрес, используемый для добавления к относительным путям, которые появляются в xhtml, например к внешнему CSS.

Итак, я попытался поставить

контекстный путь / css

direcotry в baseURL и использовал его в setDocument(). Все еще нет результата

Итак, мой вопрос. Какой правильный URL передать как baseURL?

String baseURL = ""; // What goes here as root URL for resources
iTextRenderer.setDocument(doc,baseURL);

person Hardik Mishra    schedule 20.08.2012    source источник


Ответы (3)


FAQ сообщает следующее:

URL-адрес является «базовым», который для обычного URL-адреса будет родительским местоположением - родительским каталогом или местоположением, где находится документ, который вы визуализируете. Если ваш документ имеет абсолютные URI для CSS и изображений, или он не имеет внешние ссылки вообще, тогда базовый URL-адрес может быть нулевым. Если ваш документ имеет какие-либо относительные URI для CSS или изображений, тогда базовый URL-адрес не должен быть нулевым, а должен указывать на каталог или адрес, где находится текущий документ.

Вы тестировали путь к вашему документу вместо пути к вашему CSS? Однако у меня тоже были проблемы со связыванием CSS, поэтому я вставил URI (пока никаких проблем :-)). Если вы воспользуетесь ссылкой, которую я опубликовал выше, она будет работать?

Приносим извинения за новый пост, но в комментариях говорилось, что у меня остался только отрицательный символ ...

person ollo    schedule 30.08.2012
comment
Не могли бы вы объяснить: извините за новый пост, но в комментариях мне сказали, что у меня остался только отрицательный символ .... Я не имел в виду ничего саркастического в своем комментарии. И во-вторых, да, он работает с абсолютными URL-адресами. - person Hardik Mishra; 31.08.2012
comment
Нет-нет :-) Мой пост был слишком длинным для комментариев. Длина ограничена, поэтому я не смог опубликовать его. - person ollo; 31.08.2012

Вы можете вставить пути CSS, поместив
<link rel="stylesheet" type="text/css" href="file://path/to/your.css" />
в свой документ (заголовок).

(В некоторых случаях вы можете использовать простой путь вместо URI)

person ollo    schedule 24.08.2012
comment
Спасибо за ответ. Я знаю, что это если вы передадите абсолютный URL. (Я уже упоминал об этом: D) Но есть нечто, называемое baseURL, которое позволяет указать путь к вашему каталогу ресурсов. Есть какие-нибудь указания на это? - person Hardik Mishra; 30.08.2012
comment
Если вы можете помочь, есть еще один вопрос: stackoverflow.com/questions/12059807/ - person Hardik Mishra; 30.08.2012

Проблема не в пути к файлу, проблема в носителе. Одно дело - визуализировать на экран, а другое - на печатные носители, такие как файл pdf. Поэтому вам нужно добавить атрибут в TAG таблицы стилей внутри вашего XML-файла.

Из code.google.com/p/flying-saucer/wiki/FAQPDF

Мой PDF-файл не поддерживает мой CSS!

PDF рассматривается как «печатный» носитель; см. раздел спецификации CSS 2.1 о типах мультимедиа. Убедитесь, что вы указали тип мультимедиа для своего CSS, когда связываете или встраиваете его; используйте тип «печать» или «все».

Быстрый ответ - добавить атрибут media="all" в TAG таблицы стилей XML следующим образом:

<?xml-stylesheet href="foo.css" media="all" type="text/css"?>

альтернативу вы можете использовать media="print"

person Lalo Mtz    schedule 30.01.2014