Como posso imprimir uma página da Web no modo paisagem usando o Headless-Chromium na linha de comando no Linux?

2

Estou tentando este comando. Isso funciona bem.

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

No entanto, sempre é impresso no modo retrato, mas desejo imprimir a página da Web no modo paisagem.

Existe algum parâmetro ou argumento para passar o modo (retrato ou paisagem) para o Headless-Chromium na linha de comando para que possamos imprimir qualquer página da web de acordo com o modo retrato ou paisagem?

    
por Alejandro Diego 31.12.2017 / 03:50

1 resposta

5

Bem, certamente a pergunta precisa de mais pesquisas e estou escrevendo o que eu encontrei sobre isso. Então, pode não ser uma resposta exata e, de alguma forma, mais pode ser adicionada a ela.

Como começou

No Problema 603559 intitulado Headless Chrome: save page to pdf em bugs.chromium.org , um usuário expressou sua sugestão para adicionar o parâmetro print-options em comentário # 50

would it really be such trouble to add switch like:

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

It's really not just "small wrapper script (in any language with a WebSockets library)" because you have to handle a lot of events during process instead of just invoking a command and wait for it's exit status.

Logo abaixo, depois do Comentário # 51 por meio do projeto Contribuidor eseckler , afirma claramente que

Please consider the more general problem - We don't intend to provide all the flexibility that DevTools provides through command line options: There are various technical reasons why command line options cannot provide the same flexibility (e.g. the event-based nature of DevTools). Adding more options won't solve this general misfit.

I think that we should be aiming for a more library-based approach for headless user environments (e.g. nodejs, python, java, ..). Such a library can implement a default, but more customizable, page load/life cycle that includes common functions such as rendering a pdf/screenshot. I think we could provide an example/reference library and application (say, for nodejs) as part of headless chromium. Filed https://crbug.com/719921 to track this discussion.

It is likely that this will lead to deprecation (and eventual removal) of --headless mode command line flags such as --print-to-pdf or --screenshot.

Agora você pode ver que a linha Ist afirma claramente que

We don't intend to provide all the flexibility that DevTools provide through command-line options

É bem verdade que o método DevTools do Google Page.printToPDF descreve todos os parâmetros que pode ser usado e o primeiro parâmetro que declara é Landscape (Orientation) that is by-default false.

O que está sendo feito pelos desenvolvedores

Agora Número 2829973002 intitulado add customized printing setting for headless (Closed) decsribes 3 coisas a serem adicionadas às configurações de impressão para headless no código. Estes são

1) Add parameters to printToPDF command, which let the user to specify printing settings like paper size, margin size, etc.

2) PrintWebViewHelper::PrintPageInternal and PrintWebViewHelper::RenderPage feed print_preview_context_.total_page_count() to PrintHeaderAndFooter. However, HeadlessPrintManager issues PrintMsg_PrintPages IPC message, which leaves print_preview_context_ uninitialized. To solve the problem, add page_count as an arg to these two methods.

3) Added unit test and browser test for print to pdf.

O ponto aqui, afirma sobre as configurações de impressão, como tamanho do papel, tamanho da margem, etc., mas não declara explicitamente sobre as configurações de orientação.

Na mesma página, você pode ver cada conjunto de patches (Total 19) do que foi alterado na base de código. Além disso, o Link Commited mostra a confirmação final das alterações propostas nas configurações de impressão em codebase, após o qual O problema 2829973002 foi marcado como Closed . O commit final também lista os arquivos modificados para as mudanças propostas.

Então, é possível imprimir no modo Paisagem?

Com referência aos arquivos de código-fonte page_handler.cc e headless_print_manager.cc listado no link Comprometido, Podemos passar pelas seguintes linhas de código.

page_handler.cc Linhas 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; }

Aqui, a função PrintToPDF recebe o parâmetro Landscape , cujo tipo de dados é bool , que significa verdadeiro ou falso.

Agora, headless_print_manager.cc define todos os sem cabeça funções de impressão e inclui headless_print_manager.h no cabeçalho que define o namespace printing . Ele define todas as configurações de impressão sem cabeçalho na função HeadlessPrintSettings na estrutura.

Linhas 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;
    };

A resposta

Você pode ver claramente no código acima a terceira linha que diz

HeadlessPrintSettings(): landscape(false)

Portanto, a impressão de qualquer página da Web usando o Chrome sem cabeçalho sempre será impressa no modo retrato, pois o modo paisagem padrão está definido como falso. Existem muitas outras configurações de impressão que você pode explorar através deste código.

Observação: eu sei que a resposta poderia ser um não-sincero, mas achei que compartilhar minhas descobertas e as referências relevantes seria a melhor opção para todos.

    
por 01.01.2018 / 11:45