Предварительная обработка HTML CSS JS для iText - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь использовать iText, встроенный в код Java, чтобы превратить веб-страницу, созданную с помощью HTML / CSS / JS, в PDF.Однако, iText сообщил нам, что хотя pdfHTML поддерживает CSS, он не поддерживает JS.Они рекомендовали использовать препроцессор для «запуска» Javascript на странице и возврата необработанного HTML.

Без Javascript iText генерирует PDF довольно хорошо.Однако нам нужно иметь возможность вставлять данные из вызова службы в HTML.Я использовал JQuery для достижения этой цели.Мы также вызываем и используем FusionCharts API для визуализации некоторых диаграмм.Они также работают до поколения PDF.

Кто-нибудь знает что-нибудь подобное?Он также должен быть в состоянии вызываться из нашего Java-интерфейса.

Спасибо!

1 Ответ

0 голосов
/ 02 декабря 2018

Существует несколько способов оценки кода JS на страницах HTML + CSS + JS.Для этого нам нужен аналог браузера (или самого браузера), потому что оценка JS с манипулированием DOM - это именно то, что браузеры должны делать перед рендерингом страниц.

Опция 1

Использование HtmlUnit - «Браузер без графического интерфейса для программ Java».

Сначала нам нужно добавить зависимость (например, через Maven):

<dependency>
  <groupId>net.sourceforge.htmlunit</groupId>
  <artifactId>htmlunit</artifactId>
  <version>2.32</version>
</dependency>

Затем,откройте страницу, подождите, пока JS завершит свою работу, и передайте исходный код страницы в iText pdfHTML:

WebClient webClient = new WebClient();
// You might need this configuration if HtmlUnit fails without it
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.waitForBackgroundJavaScript(10 * 1000);
HtmlPage page = webClient.getPage(url);
String xml = page.asXml();

ConverterProperties properties = new ConverterProperties().setBaseUri(url);
HtmlConverter.convertToPdf(source, new PdfWriter("result.pdf"), properties);

HtmlUnit не полностью поддерживает JS, поэтому он может выдавать ошибки при оценке кода JS.Поэтому вы можете их подавить (я добавил эту конфигурацию и комментарий к ней в пример кода).Конечно, ваш результат может выглядеть неправильно.Но это чисто Java-решение.

Вариант 2

Обратитесь за помощью к реальным браузерам, которые мы используем каждый день

Браузеры, которые мы используем каждый день (Chrome, Firefox,Safari и т. Д.) Имеют лучшую поддержку оценки JS.Вы можете использовать браузерные движки, используя, например, Selenium инструмент веб-автоматизации.Что мы будем делать - это открывать страницу в браузере, ждать, пока страница загрузится, а затем использовать источник для преобразования HTML -> PDF.Мой пример будет для Chrome, но вы можете сделать это аналогичным образом для других браузеров.Сначала вам нужно скачать драйвер Chrome и распаковать его где-нибудь в вашей системе.

Затем добавить следующие зависимости Maven:

<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-chrome-driver</artifactId>
  <version>3.14.0</version>
</dependency>
<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-java</artifactId>
  <version>3.14.0</version>
</dependency>

Теперь мы должнынапишите некоторый код, подобный первому варианту:

System.setProperty("webdriver.chrome.driver", "C:\\path\\to\\chromedriver.exe");
ChromeDriver driver = new ChromeDriver();
driver.get(url);
new WebDriverWait(driver, 20).until(
        webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
String source = driver.getPageSource();
driver.close();

ConverterProperties properties = new ConverterProperties().setBaseUri(url);
HtmlConverter.convertToPdf(source, new PdfWriter("result.pdf"), properties);

Этот параметр может быть немного медленнее и имеет больше предварительных условий (браузер, драйверы), но он гарантирует пуленепробиваемую поддержку JS.

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