web-dev-qa-db-ja.com

ChromeDriver-ページ読み込み後のprint-to-pdf

ドキュメント によると、ChromeはPDFをエクスポートするために--print-to-pdfを使用してヘッドレスモードで起動できます。これは、GETリクエストでアクセスできるページに適しています。

Chrome内から複数のナビゲーションリクエストを実行した後にPDFをエクスポートできるようにするPDFへの印刷ソリューションを見つけようとしています。例:google.comを開き、検索クエリを入力し、最初の結果リンクをクリックして、PDFにエクスポートします。

[利用可能な非常に限られた量の]ドキュメントとサンプルを見て、ページが読み込まれた後、PDFをエクスポートするようにChromeに指示する方法を見つけることができませんでした。 Java chrome-driverを使用しています。

Chromeを使用しない1つの可能な解決策は、 wkhtmltopdf のようなツールを使用することです。このパスを使用すると、HTMLをツールに送信する前に、次のことを強制されます。

  • hTMLをローカルファイルに保存する
  • dOMをトラバースし、すべてのファイルリンク(画像、js、cssなど)をダウンロードする

ダウンロードのファイルパスをwkhtmltopdfが正しく読み取るために正しいものにするために、私は自分の側で多くのいじくりを必要とするため、このパスを好まないでください。

ChromeにPDFに印刷するように指示する方法はありますか?

10
jankovd

回答がありませんので、回避策を説明します。 Chromeから現在のページを印刷するように要求する方法を見つけるのではなく、別のルートをたどりました。

この例では、クエリ「example」でGoogleから結果ページをダウンロードしようとします。

  1. driver.get("google.com")で移動し、クエリ「example」を入力して、[Google Search]をクリックします
  2. 結果ページが読み込まれるまで待ちます
  3. driver.getPageSource()を使用してページのソースを取得します
  4. たとえば、ソースを解析します。 Jsoupは、この目的のために定義されたエンドポイントを指すようにすべての相対リンクを再マップします(以下で説明)-localhost:8080の例。リンク「./style.css」は「localhost:8080/style.css」になります
  5. HTMLをファイルに保存します。 「query-example」という名前
  6. chrome --print-to-pdf localhost:8080/search?id=query-exampleを実行します

chromeはコントローラーにHTMLを要求し、返されるHTMLで定義されたリソースの場合、コントローラーに移動します。これは、相対リンクを再マップしたためです。そのリクエストをリソースの実際の場所-google.comに転送します。以下はSpringコントローラーの例です。この例は不完全であり、ここではガイダンスとしてのみ示しています。

@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);
  }
}
2
jankovd

コマンドラインからこれを行う例は、ページ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
1
J. Win.