要从HTML文件生成PDF,我想使用selenium Chrome驱动程序。
我用命令行试了一下:
xlAutoFree12
它完美无缺,所以我想用JAVA做到这一点,这是我的代码:
chrome.exe --headless --disable-gpu --print-to-pdf file:///C:invoiceTemplate2.html
服务器启动没有问题,但是使用我在“选项”中指定的参数的多个选项卡打开了chrome。
对此有何解决方案? THX。
答案 0 :(得分:1)
确实可以使用Selenium和ChromeDriver(已通过Chrome 85版进行测试)完成此操作,但是从网络驱动程序启动Chrome时,不能使用“打印到pdf”选项。
要做的是使用ChromeDriver的命令执行功能:
有一个名为export const setShowSearchQueryUtil = (query) => {
return query;
};
的命令,它提供PDF输出功能。将返回一个包含“数据”项的字典,并以base-64编码格式生成PDF。
不幸的是,我没有完整的Java示例,但是在此答案中,有一个C#示例(与Java相比,Selenium方法在C#中的命名不同,但原理应相同):
https://stackoverflow.com/a/63970792/2416627
Chrome中的Page.printToPDF
命令记录在这里:
https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-printToPDF
答案 1 :(得分:0)
你必须做两件事。
首先:使用selenium制作截图。
第二:使用任何pdf工具转换该屏幕截图,例如itext。在这里,我将展示如何执行此操作的完整示例。
步骤1:从here下载jar文件,并将jar文件添加到构建路径中。
第2步:将此代码添加到您的项目中。
ChromeOptions options = new ChromeOptions();
options.addArguments("disable-infobars");
options.addArguments("--print-to-pdf");
WebDriver driver = new ChromeDriver(options);
driver.get("file:///C:/invoiceTemplate2.html");
try {
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File("screenshot.png"));
Document document = new Document(PageSize.A4, 20, 20, 20, 20);
PdfWriter.getInstance(document, new FileOutputStream("webaspdf.pdf"));
document.open();
Image image = Image.getInstance("screenshot.png");
document.add(image);
document.close();
}
catch (Exception e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
注意:要使用上面提到的itext包,请将所需的导入添加到代码中。
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
答案 2 :(得分:0)
无法使用ChromeDriver获得理想的结果,我的解决方法是从Java程序的命令行中调用无头chrome。
这在Windows上有效,但是只需更改command变量中使用的路径的内容也应使其在Linux中也可以使用。
public void generatePdf(Path inputPath, Path outputPath) throws Exception {
try {
String chromePath = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe";
String command = chromePath + " --headless --disable-gpu --run-all-compositor-stages-before-draw --print-to-pdf=" + outputPath.toString() + " " + inputPath.toString();
// Runs "chrome" Windows command
Process process = Runtime.getRuntime().exec(command);
process.waitFor(); // Waits for the command's execution to finish
}catch (Exception e){
e.printStackTrace(System.err);
throw e;
}finally{
// Deletes files on exit
input.toFile().deleteOnExit();
output.toFile().deleteOnExit();
}
}
注意:输入和输出路径都是使用NIO创建的临时文件。
答案 3 :(得分:0)
该代码将帮助您在 Selenium c# 上以 PDF
格式保存页面
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
protected void PDFconversion(ChromeDriver driver, string root, string rootTemp)
{
//Grid.Rows.Add(TxtBxName.Text, TxtBxAddress.Text);
try
{
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
Thread.Sleep(500);
js.ExecuteScript("setTimeout(function() { window.print(); }, 0);");
Thread.Sleep(500);
driver.SwitchTo().Window(driver.WindowHandles.Last());
Thread.Sleep(500);
string JSPath = "document.querySelector('body>print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('#destinationSettings').shadowRoot.querySelector('#destinationSelect').shadowRoot.querySelector('print-preview-settings-section:nth-child(9)>div>select>option:nth-child(3)')";
Thread.Sleep(500);
IWebElement PrintBtn = (IWebElement)js.ExecuteScript($"return {JSPath}");
Thread.Sleep(500);
PrintBtn.Click();
string JSPath1 = "document.querySelector('body>print-preview-app').shadowRoot.querySelector('#sidebar').shadowRoot.querySelector('print-preview-button-strip').shadowRoot.querySelector('cr-button.action-button')";
Thread.Sleep(1000);
IWebElement PrintBtn1 = (IWebElement)js.ExecuteScript($"return {JSPath1}");
PrintBtn1.Click();
Thread.Sleep(1000);
SendKeys.Send("{HOME}");
SendKeys.Send(rootTemp + "\\" + "result.pdf"); // Path
SendKeys.Send("{TAB}");
SendKeys.Send("{TAB}");
SendKeys.Send("{TAB}");
SendKeys.Send("{ENTER}");
Thread.Sleep(1000);
}
catch (Exception ex){}
}