当前位置: 首页 > 知识库问答 >
问题:

ChromeDriver--页面加载后打印到PDF

严昊昊
2023-03-14

根据这些文件,可以使用--print-to-pdf以无头模式启动Chrome以导出网页的PDF格式。这对于通过get请求访问的页面很好。

试图找到一个打印到PDF的解决方案,这将允许我导出一个PDF后,执行多个导航请求从Chrome。示例:打开google.com,输入搜索查询,单击第一个结果链接,导出到PDF。

看着(数量非常有限的)文档和样本,我没能找到一种方法来指示Chrome在页面加载后导出PDF。我正在使用Java的chrome-driver

一个不涉及Chrome的可能解决方案是使用像wkhtmltopdf这样的工具。在将HTML发送到该工具之前,沿着此路径将迫使我执行以下操作:

  • 将HTML保存在本地文件中
  • 遍历DOM,下载所有文件链接(图像、js、css等)

我不喜欢这个路径,因为我需要做大量的修改[我假设]才能使下载的文件路径正确,以使wkhtmltopdf正确读取。

有没有一种方法可以指示Chrome打印到PDF格式,但只能在页面加载之后?

共有2个答案

宰父单弓
2023-03-14

一个从命令行执行此操作的示例,需要对页面html和sed进行一些修补:

LOGIN='myuserid'
PASSW='mypasswd'
AUTH='pin=$LOGIN&accessCode=$PASSW&Submit=Submit'
TIMESTAMP=`TZ=HST date -d "today" +"%m/%d/%y %I:%M %p HST"`
wget -q --save-cookies cookies.txt --keep-session-cookies \
    --post-data $AUTH \
    https://csea.ehawaii.gov/iwa/index.html
sed -i 's#href="/iwa/css#href="./bin#g' index.html
sed -i 's#src="/iwa/images#src="./bin#g' index.html
wkhtmltopdf -q --print-media-type \
            --header-left "$d" --header-font-size 10 \
            --header-line --header-spacing 10 \
            --footer-left "Page [page] of [toPage]" --footer-font-size 10 \
            --footer-line --footer-spacing 10 \
            --footer-right "$TIMESTAMP" \
            --margin-bottom 20 --margin-left 15 \
            --margin-top 20 --margin-right 15 \
            index.html index.pdf

假设Cookie有效,则可以访问登录后可用的其他页面,如下所示:

wget -q --load-cookies cookies.txt https://csea.ehawaii.gov/otherpage.html
wkhtmltopdf <all the options> otherpage.html otherpage.pdf

此外,我以前曾将所有css和图像转储到本地bin目录中,如下所示:

wget -r -A.jpg -A.gif -A.css -nd -Pbin \
    https://csea.ehawaii.gov/iwa/index.html
羿经武
2023-03-14

由于没有答案,我将解释我的变通方法。而不是试图找到如何从Chrome请求打印当前页面,我走了另一条路。

对于本例,我们将尝试从Google下载查询“example”的结果页面:

  1. 使用driver.get(“google.com”)导航,输入查询“示例”,单击“Google Search”
  2. 等待加载结果页
  3. 使用驱动程序检索页面源。GetPageSource()
  4. 使用例如Jsoup解析源,以便将所有相关链接重新映射为指向为此目的定义的端点(如下所述)-示例为localhost:8080。链接“./style.css”将变为“localhost:8080/style.css”
  5. 将HTML保存到文件,例如名为“query-example”
  6. 运行chrome--打印到PDF localhost:8080/search?id=query-example

会发生的情况是,chrome将向我们的控制器请求HTML,而对于我们返回的HTML中定义的资源,它将被转到我们的控制器--因为我们重新映射了相关链接--然后控制器将请求转发到资源的真实位置--Google.com。下面是一个spring控制器的例子,注意,这个例子是不完整的,这里只是作为一个指导。

null

@RestController
@RequestMapping
public class InternationalOffloadRestController {
  @RequestMapping(method = RequestMethod.GET, value = "/search/html")
  public String getHtml(@RequestParam("id") String id) {
    File file = new File("location of the HTML file", id);
    try (FileInputStream input = new FileInputStream(file)) {
      return IOUtils.toString(input, HTML_ENCODING);
    }
  }
  @RequestMapping("/**") // forward all remapped links to google.com
  public void forward(HttpServletResponse httpServletResponse, ...) {
    URI uri = new URI("https", null, "google.com", -1, 
      request.getRequestURI(), request.getQueryString(), null);
    httpServletResponse.setHeader("Location", uri.toString());
    httpServletResponse.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
  }
}

null

 类似资料:
  • 问题内容: 我有一个客户想打印的网页,而我遇到的麻烦是让页脚位于最后一个打印页面的底部,而不仅仅是内容结束时 我尝试了类似的东西 但它在每页末尾显示页脚。 也许我对CSS的要求太高了…可行吗? 我想我应该对 的(^_^)发疯 问题答案: 尝试将相对的身体和绝对的页脚定位: 借助CSS 3 Paged Media模块,您可以使用以下代码:

  • 但是,对于以下所有使用chromedriver的测试,浏览器都不能成功导航到URL。 浏览器启动,瞬间显示字符数据;出现在地址栏中(就像第一个测试中一样),然后将正确的URL插入到地址栏中。但是,页面永远不会加载,你得到了标准的chrome这个网页不可用的消息,在浏览器的正文/画布上有两个按钮reload和更多。 这是已知的问题吗? 以下异常将被删除: NosuchWindowException:

  • 问题内容: 我已经阅读了很多有关打印页码的网站,但是当我尝试打印html页面时,仍然无法显示它。 接下来是CSS代码: 我试图把这个页面规则放进去 在其外部,尝试将其放入中,但没有任何帮助使我在页面上显示页码。我尝试使用FireFox和Chrome(您知道基于WebKit的浏览器)。我认为问题出在我的HTML或CSS代码中。 有人可以告诉我一个在具有多个页面的大html页面中实现此规则的示例吗?我

  • 在某些情况下,需要在网页上放置一个按钮,以便使用实际的打印机来打印网页的内容。 JavaScript帮助我们实现了打印网页的实现。 当执行JavaScript中的打印功能时,它将打印当前网页。只需在事件中使用它即可直接调用此函数。 语法 示例代码: 运行结果如下:

  • 很多时候,您希望在网页上放置一个按钮,通过实际的打印机打印该网页的内容。 JavaScript帮助您使用window对象的print函数实现此功能。 JavaScript打印函数window.print()在执行时打印当前网页。 您可以使用onclick事件直接调用此函数,如以下示例所示。 例子 (Example) <html> <body> <form>

  • 我需要设置一个ng click事件,以便它加载一个新页面,然后,一旦页面加载完毕,滚动到页面上的一个定位点。我已经尝试了这篇文章中提出的每一个解决方案,但我无法让它正常工作。 大多数解决方案都围绕着滚动到已经加载的页面上的锚定。我需要在加载新页面后出现滚动。 这表示“配置文件卡”中的按钮。当用户点击卡片时,它会将他们带到一个个人资料页面。但是,当他们单击按钮时,它需要将他们带到该配置文件页面的#j