web-dev-qa-db-ja.com

LinuxのコマンドラインでHeadless-Chromiumを使用して横向きモードでウェブページを印刷するにはどうすればよいですか?

このコマンドを試しています。それはうまくいきます。

chromium-browser  --headless  --disable-gpu --print-to-pdf=file14.pdf file:///input.html

ただし、常に縦向きモードで印刷しますが、横向きモードでWebページを印刷したいと思います。

コマンドラインでヘッドレスクロムにモード(ポートレートまたはランドスケープ)を渡して、ポートレートモードまたはランドスケープモードのいずれかで任意のWebページを印刷できるようにするためのパラメーターまたは引数はありますか?

5
Alejandro Diego

まあ、確かに質問はもっと研究が必要であり、私はそれに関して私が見つけたものを書き留めています。だから、それは正確な答えではないかもしれませんし、どういうわけかそれを追加することができます。

それがどのように始まったか

Issue 603559 タイトル_Headless Chrome: save page to pdf_ on bugs.chromium.org で、ユーザーは_print-options_パラメーターを コメント#5

次のようなスイッチを追加するのは本当に面倒ですか?

-print-options = landscape、displayHeaderFooter、printBackground、scale、paperWidth、paperHeight、
marginTop、marginBottom、marginLeft、marginRight、pageRanges

コマンドを呼び出して終了ステータスを待つのではなく、プロセス中に多くのイベントを処理する必要があるため、実際には「小さなラッパースクリプト(WebSocketライブラリを備えた任意の言語)」だけではありません。

そのすぐ下に続く コメント#51 プロジェクト寄稿者による eseckler 、明確に次のように述べています

より一般的な問題を検討してください-コマンドラインオプションを通じてDevToolsが提供するすべての柔軟性を提供するつもりはありません:コマンドラインオプションが同じ柔軟性を提供できないさまざまな技術的理由があります(たとえば、DevToolsのイベントベースの性質)。オプションを追加しても、この一般的な不適合は解決されません。

ヘッドレスユーザー環境(nodejs、python、Javaなど)に対して、よりライブラリベースのアプローチを目指すべきだと思います。このようなライブラリは、PDF /スクリーンショットのレンダリングなどの一般的な機能を含む、デフォルトの、しかしよりカスタマイズ可能なページのロード/ライフサイクルを実装できます。ヘッドレスクロムの一部として、サンプル/リファレンスライブラリとアプリケーション(たとえば、nodejs)を提供できると思います。この議論を追跡するために提出 https://crbug.com/719921

これにより、-print-to-pdfや--screenshotなどの--headlessモードのコマンドラインフラグが非推奨(および最終的には削除)される可能性があります。

これで、Ist行が明確に次のように述べていることがわかります。

_We don't intend to provide all the flexibility that DevTools provide through command-line options_

Chrome DevToolsメソッドPage.printToPDF は、使用できるすべてのパラメーターを記述し、最初に示されるパラメーターはLandscape (Orientation) that is by-default false.であるため、これは非常に真実です。

開発者によって行われていること

現在 Issue 2829973002 title add customized printing setting for headless (Closed)は、コード内のヘッドレスの印刷設定に追加される3つのことを説明しています。これらは

1)printToPDFコマンドにパラメーターを追加して、ユーザーが用紙サイズ、余白サイズなどの印刷設定を指定できるようにします。

2)PrintWebViewHelper :: PrintPageInternalおよびPrintWebViewHelper :: RenderPageフィードprint_preview_context_.total_page_count()をPrintHeaderAndFooterにフィードします。ただし、HeadlessPrintManagerはPrintMsg_PrintPages IPCメッセージを発行し、print_preview_context_を初期化しないままにします。この問題を解決するには、page_countを引数としてこれら2つのメソッドに追加します。

3)PDFに印刷用の単体テストとブラウザテストを追加しました。

ここで重要な点は、用紙サイズ、余白サイズなどの印刷設定について述べていますが、方向設定については明示的に述べていません。

同じページで、コードベースで変更されたパッチセット(合計19)をすべて確認できます。また、リンク コミット は、コードベースの印刷設定への提案された変更の最終コミットを示し、その後 問題2829973002Closed。最後のコミットでは、提案された変更のために変更されたファイルも一覧表示されます。

それで、横向きモードで印刷することは可能ですか?

Committedリンクにリストされているソースコードファイル page_handler.cc および headless_print_manager.cc を参照すると、次のコード行を実行できます。

page_handler.cc行302-316

_void PageHandler::PrintToPDF(Maybe<bool> landscape,
                         Maybe<bool> display_header_footer,
                         Maybe<bool> print_background,
                         Maybe<double> scale,
                         Maybe<double> paper_width,
                         Maybe<double> paper_height,
                         Maybe<double> margin_top,
                         Maybe<double> margin_bottom,
                         Maybe<double> margin_left,
                         Maybe<double> margin_right,
                         Maybe<String> page_ranges,
                         std::unique_ptr<PrintToPDFCallback> callback) { callback->sendFailure(Response::Error("PrintToPDF is not implemented"));return; }
_

ここで、関数PrintToPDFは、データ型がLandscapeであるパラメーターboolを受け取り、trueまたはfalseを意味します。

ここで、 headless_print_manager.cc はすべてのヘッドレス印刷関数を定義し、_namespace printing_を定義するヘッダーに headless_print_manager.h を含めます。これは、構造内の関数HeadlessPrintSettingsですべてのヘッドレス印刷設定を定義します。

22〜41行目

 struct HeadlessPrintSettings {
 HeadlessPrintSettings()
:landscape(false)、
 display_header_footer(false)、
 should_print_backgrounds(false)、
 scale(1){} 
 
 gfx :: Size paper_size_in_points; 
 PageMargins margins_in_points; 
 bool landscape; 
 bool display_header_footer; 
 bool should_print_backgrounds; 
 // scale = 1は100%を意味します。
 double scale; 
 std :: string page_ranges; 
}; 

答え

3行目の上のコードではっきりとわかります

HeadlessPrintSettings(): landscape(false)

したがって、デフォルトで横向きモードがfalseに設定されているため、ヘッダーなしクロムを使用してWebページを印刷すると、常に縦向きで印刷されます。このコードで調べることができる他の多くの印刷設定もあります。

注:答えは正直にNOになる可能性があることは知っていますが、私の調査結果と関連する参考資料を共有することは、すべての人にとってより良い選択肢になると思いました。

8
C0deDaedalus