3

Я пытаюсь эту команду. Это работает хорошо.

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

Тем не менее, он всегда печатает в портретном режиме, но я хочу напечатать веб-страницу в альбомном режиме.

Есть ли какой-либо параметр или аргумент для передачи режима (книжного или альбомного) в Headless-Chromium в командной строке, чтобы мы могли напечатать любую веб-страницу соответственно в портретном или альбомном режиме?

1 ответ1

7

Ну, конечно, Вопрос требует дополнительных исследований, и я записываю то, что нашел по этому поводу. Таким образом, это может быть не точный ответ, и как-то еще можно добавить к нему.

Как это началось

В выпуске 603559 под названием Headless Chrome: save page to pdf на bugs.chromium.org пользователь высказал свое предложение добавить параметр print-options в комментарии № 50.

действительно ли было бы такой проблемой добавить переключатель как:

-print-опции = пейзаж, displayHeaderFooter, printBackground, масштаб, PaperWidth, paperHeight,
MarginTop, MarginBottom, MarginLeft, marginRight, pageRanges

На самом деле это не просто «небольшой скрипт-обертка (на любом языке с библиотекой WebSockets)», потому что вы должны обрабатывать много событий во время процесса, а не просто вызывать команду и ждать, пока она не выйдет.

Чуть ниже этого комментария № 51 от Project Contributer eseckler четко сказано, что

Пожалуйста, рассмотрите более общую проблему - мы не намерены предоставлять всю гибкость, которую DevTools предоставляет через параметры командной строки: Существуют различные технические причины, почему параметры командной строки не могут обеспечить такую же гибкость (например, характер DevTools на основе событий). Добавление дополнительных опций не решит это общее несоответствие.

Я думаю, что мы должны стремиться к более основанному на библиотеках подходу для безголовых пользовательских сред (например, nodejs, python, java, ...). Такая библиотека может реализовать стандартный, но более настраиваемый жизненный цикл загрузки / загрузки страницы, который включает в себя общие функции, такие как рендеринг PDF / снимка экрана. Я думаю, что мы могли бы предоставить пример / справочную библиотеку и приложение (скажем, для nodejs) как часть безголового хрома. Поданный 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 feed print_preview_context_.total_page_count() для PrintHeaderAndFooter. Однако HeadlessPrintManager выдает сообщение IPC PrintMsg_PrintPages, в результате чего print_preview_context_ не инициализируется. Чтобы решить эту проблему, добавьте page_count в качестве аргумента к этим двум методам.

3) Добавлен юнит-тест и браузерный тест для печати в pdf.

В этом пункте говорится о настройках печати, таких как размер бумаги, размер полей и т.д., Но явно не говорится о настройках ориентации.

На той же странице вы можете увидеть каждый набор патчей (всего 19) из того, что было изменено в кодовой базе. Кроме того, Link Commited показывает окончательную фиксацию предложенных изменений в настройках печати в базе кода, после чего выпуск 2829973002 был помечен как Closed. В окончательном коммите также перечислены файлы, измененные для предложенных изменений.

Итак, можно ли печатать в альбомном режиме?

С помощью ссылки на файлы исходного кода page_handler.cc и headless_print_manager.cc, указанной в ссылке Commited, мы можем пройти следующие строки кода.

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 определяет все функции безголовой печати и включает headless_print_manager.h в заголовок, который определяет namespace printing . Он определяет все параметры безголовой печати в функции 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 means 100%.
       double scale;
       std::string page_ranges;
    };

Ответ

Вы можете ясно увидеть в коде над третьей строкой, которая говорит

HeadlessPrintSettings(): landscape(false)

Таким образом, печать любой веб-страницы с использованием Headerless-chrome всегда печатает в портретной ориентации, поскольку по умолчанию для альбомного режима установлено значение false. Есть много других настроек печати, которые вы можете изучить с помощью этого кода.

Примечание: я знаю, что ответ может быть прямым НЕТ, но я подумал, что поделиться своими выводами и соответствующими ссылками будет лучшим вариантом для всех.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .