Существует несколько способов оценки кода 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.