使用selenium chrome驱动程序生成PDF

时间:2017-12-09 13:26:26

标签: java google-chrome selenium pdf selenium-webdriver

要从HTML文件生成PDF,我想使用selenium Chrome驱动程序。

我用命令行试了一下:

xlAutoFree12

它完美无缺,所以我想用JAVA做到这一点,这是我的代码:

chrome.exe --headless --disable-gpu --print-to-pdf   file:///C:invoiceTemplate2.html

服务器启动没有问题,但是使用我在“选项”中指定的参数的多个选项卡打开了chrome。

对此有何解决方案? THX。

4 个答案:

答案 0 :(得分:1)

确实可以使用Selenium和ChromeDriver(已通过Chrome 85版进行测试)完成此操作,但是从网络驱动程序启动Chrome时,不能使用“打印到pdf”选项。

要做的是使用ChromeDriver的命令执行功能:

https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/remote/RemoteWebDriver.html#execute-java.lang.String-java.util.Map-

有一个名为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){}
    }