起源

起源

我正在尝试这个命令。效果很好。

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

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

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

答案1

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

起源

在里面问题 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 库的语言)”,因为你必须在处理过程中处理很多事件,而不仅仅是调用命令并等待它的退出状态。

就在下面评论#51由项目贡献者埃塞克勒,明确指出

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

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

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

现在你可以看到第一行清楚地表明

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 个)。此外,链接承诺显示代码库中对打印设置拟议更改的最终提交,之后 问题 2829973002被标记为Closed. 最终的提交还列出了针对建议的更改所修改的文件。

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

参考源代码文件页面处理程序无头打印管理器在提交的链接中列出,我们可以浏览以下代码行。

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为真或假的参数。

现在,无头打印管理器定义所有无头打印功能,包括无头打印管理器.h在定义的标题中。它定义了结构中namespace printing函数中的所有无头打印设置。HeadlessPrintSettings

第 22-41 行

结构 HeadlessPrintSettings {
       无头打印设置()
       :景观(假),
       display_header_footer(false),
       应该打印背景(false),
       比例(1){}

       gfx::Size 纸张尺寸(单位:点);
       页面边距,单位为点;
       布尔景观;
       bool 显示_header_footer;
       bool should_print_backgrounds;
       // scale = 1 表示 100%。
       双尺度;
       std::string 页面范围;
    };

答案

你可以清楚地看到上面第三行的代码

HeadlessPrintSettings(): landscape(false)

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

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

相关内容