如何在 Linux 的命令行上使用 Headless-Chromium 以横向模式打印网页?

Ale*_*ego 7 linux printing chromium

我正在尝试这个命令。它运作良好。

chromium-browser  --headless  --disable-gpu --print-to-pdf=file14.pdf file:///input.html
Run Code Online (Sandbox Code Playgroud)

但是,它总是以纵向模式打印,但我想以横向模式打印网页。

是否有任何参数或参数可以在命令行上将模式(纵向或横向)传递给 Headless-Chromium,以便我们可以相应地以纵向或横向模式打印任何网页?

C0d*_*lus 11

嗯,当然这个问题需要更多的研究,我正在写下我发现的关于它的内容。因此,这可能不是一个确切的答案,并且可以以某种方式添加更多内容。

它是如何开始的

发行603559有权Headless Chrome: save page to pdfbugs.chromium.org,用户表达了他的建议,以便添加print-options参数评论#50

添加如下开关真的会很麻烦:

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

这真的不仅仅是“小包装脚本(在任何语言中WebSockets 库)”,因为您必须在处理过程中处理大量事件,而不仅仅是调用命令并等待其退出状态。

在Project Contributer eseckler 的评论 #51的正下方,明确指出

请考虑更普遍的问题 - 我们不打算通过命令行选项提供 DevTools 提供的所有灵活性:命令行选项无法提供相同灵活性的技术原因有多种(例如 DevTools 基于事件的性质)。添加更多选项并不能解决这种普遍的不适应。

我认为我们应该针对无头用户环境(例如 nodejs、python、java 等)采用更加基于库的方法。这样的库可以实现默认但更可定制的页面加载/生命周期,其中包括常见功能,例如呈现 pdf/屏幕截图。我认为我们可以提供一个示例/参考库和应用程序(例如,用于 nodejs)作为无头铬的一部分。提交 https://crbug.com/719921 以跟踪此讨论。

这很可能会导致 --headless 模式命令行标志的弃用(并最终删除),例如 --print-to-pdf 或 --screenshot。

现在您可以看到 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.

开发人员正在做什么

现在,标题为2829973002 的问题描述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 作为参数添加到这两个方法中。

3) 添加了用于打印到 pdf 的单元测试和浏览器测试。

这里是点,说明打印设置,如纸张大小、边距大小等,但没有明确说明方向设置。

在同一页面上,您可以看到代码库中已更改内容的每个补丁集(共 19 个)。另外,链接COMMITED显示最终提交的建议更改打印设置中的代码库,在此之后 发行2829973002标记为Closed。最终提交还列出了为建议更改而修改的文件。

那么,是否可以在横向模式下打印?

参考Commited链接中列出的源代码文件page_handler.ccheadless_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; }
Run Code Online (Sandbox Code Playgroud)

在这里,函数PrintToPDF采用Landscape数据类型为bool真或假的参数。

现在,headless_print_manager.cc定义了所有的无头打印功能,它包括headless_print_manager.h在限定的标题namespace printing。它定义HeadlessPrintSettings了结构中功能中的所有无头打印设置。

第 22-41 行

 struct HeadlessPrintSettings {
       HeadlessPrintSettings()
       :风景(假),
       display_header_footer(false),
       should_print_backgrounds(false),
       规模(1){}

       gfx::Size paper_size_in_points;
       PageMargins margins_in_points;
       布尔景观;
       bool display_header_footer;
       bool should_print_backgrounds;
       // scale = 1 表示 100%。
       双刻度;
       std::string page_ranges;
    };

答案

您可以在第三行上方的代码中清楚地看到

HeadlessPrintSettings(): landscape(false)

因此,使用 Headerless-chrome 打印任何网页将始终以纵向打印,因为默认横向模式设置为 false。您还可以通过此代码探索许多其他打印设置。

注意:我知道答案可能是直接的“否”,但我认为分享我的发现和相关参考资料对每个人来说都是更好的选择。