Come posso stampare una pagina Web in modalità orizzontale usando Headless-Chromium sulla riga di comando in Linux?


4

Sto provando questo comando. Funziona bene.

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

Tuttavia, stampa sempre in modalità verticale, ma voglio stampare la pagina Web in modalità orizzontale.

C'è qualche parametro o argomento per passare la modalità (verticale o orizzontale) a Headless-Chromium sulla riga di comando in modo da poter stampare qualsiasi pagina Web di conseguenza in modalità verticale o orizzontale?


Bene, il tuo comando funziona esattamente come dovrebbe e ho provato a stampare la pagina corrente usando il comando che hai scritto e ha funzionato perfettamente tranne che per dare alcuni avvertimenti relativi a render_frame_host_impl.cc
C0deDaedalus

Si prega di aggiungere come appare il contenuto finale dopo la stampa e come è esattamente necessario.
C0deDedalo

configura la stampa in cromo per ritratto o paesaggio
Alejandro Diego,

Risposte:


7

Bene, certamente la domanda ha bisogno di più ricerca e sto scrivendo ciò che ho trovato al riguardo. Quindi, potrebbe non essere una risposta esatta e in qualche modo è possibile aggiungere altro.

Come è iniziato

Nel numero 603559 intitolato Headless Chrome: save page to pdfsu bugs.chromium.org , un utente ha espresso il suo suggerimento di aggiungere il print-optionsparametro nel commento # 50

sarebbe davvero un tale problema aggiungere switch come:

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

In realtà non è solo un "piccolo script wrapper (in qualsiasi lingua con una libreria WebSocket) "perché devi gestire molti eventi durante il processo invece di invocare un comando e attendere il suo stato di uscita.

Proprio sotto quello che segue il commento n. 51 di Project Contributer eseckler , lo afferma chiaramente

Si prega di considerare il problema più generale: non intendiamo fornire tutta la flessibilità offerta da DevTools attraverso le opzioni della riga di comando: ci sono vari motivi tecnici per cui le opzioni della riga di comando non possono fornire la stessa flessibilità (ad es. La natura basata su eventi di DevTools). L'aggiunta di più opzioni non risolverà questo disadattato generale.

Penso che dovremmo puntare a un approccio più basato su librerie per ambienti utente senza testa (ad esempio nodejs, python, java, ..). Tale libreria può implementare un ciclo di vita / caricamento della pagina predefinito, ma più personalizzabile che include funzioni comuni come il rendering di un pdf / screenshot. Penso che potremmo fornire una libreria / applicazione di esempio / riferimento (diciamo, per nodejs) come parte del cromo senza testa. Archiviato https://crbug.com/719921 per tenere traccia di questa discussione.

È probabile che ciò comporti la deprecazione (e l'eventuale rimozione) di flag della riga di comando in modalità senza testa come --print-to-pdf o --screenshot.

Ora puoi vedere la linea Ist che lo afferma chiaramente

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

Questo è vero poiché il metodo Page.printToPDF di Chrome DevTools descrive tutti i parametri che possono essere utilizzati e il primo parametro che afferma èLandscape (Orientation) that is by-default false.

Cosa viene fatto dagli sviluppatori

Ora il numero 2829973002 intitolato add customized printing setting for headless (Closed)annulla 3 cose da aggiungere alle impostazioni di stampa per le persone senza testa nel codice. Questi sono

1) Aggiungi parametri al comando printToPDF, che consente all'utente di specificare le impostazioni di stampa come formato carta, margine, ecc.

2) PrintWebViewHelper :: PrintPageInternal e PrintWebViewHelper :: RenderPage feed print_preview_context_.total_page_count () in PrintHeaderAndFooter. Tuttavia, HeadlessPrintManager emette il messaggio IPC PrintMsg_PrintPages, che lascia print_preview_context_ non inizializzato. Per risolvere il problema, aggiungi page_count come arg a questi due metodi.

3) Aggiunti test unitari e test browser per la stampa in pdf.

In questo caso, indica le impostazioni di stampa come il formato della carta, il margine, ecc., Ma non esplicitamente le impostazioni di orientamento.

Nella stessa pagina, puoi vedere tutti i set di patch (Totale 19) di ciò che è stato modificato nella base di codice. Inoltre, Link Commited mostra il commit finale delle modifiche proposte alle impostazioni di stampa in codebase, dopo di che il numero 2829973002 è stato contrassegnato come Closed. Il commit finale elenca anche i file modificati per le modifiche proposte.

Quindi, è possibile stampare in modalità orizzontale?

Con riferimento ai file di codice sorgente page_handler.cc e headless_print_manager.cc elencati nel link Commited, possiamo passare attraverso le seguenti righe di codice.

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

Qui, la funzione PrintToPDFaccetta un parametro il Landscapecui tipo di dati boolsignifica vero o falso.

Ora, headless_print_manager.cc definisce tutte le funzioni di stampa senza testa e include headless_print_manager.h nell'intestazione che definisce il file namespace printing. Definisce tutte le impostazioni di stampa senza testa nella fucntion HeadlessPrintSettingsnella struttura.

Linee 22-41

 struct HeadlessPrintSettings {
       HeadlessPrintSettings ()
       : landscape (false),
       display_header_footer (false),
       should_print_backgrounds (falsi),
       scala (1) {}

       gfx :: Dimensioni paper_size_in_points;
       PageMargins margins_in_points;
       bool landscape;
       bool display_header_footer;
       bool should_print_backgrounds;
       // scale = 1 significa 100%.
       doppia scala;
       std :: string page_ranges;
    };

La risposta

Puoi vedere chiaramente nel codice sopra la terza riga che dice

HeadlessPrintSettings(): landscape(false)

Pertanto, la stampa di qualsiasi pagina Web utilizzando Headerless-chrome verrà sempre stampata in verticale perché la modalità orizzontale predefinita è impostata su false. Ci sono molte altre impostazioni di stampa che puoi esplorare attraverso questo codice.

Nota: so che la risposta potrebbe essere un NO chiaro, ma ho pensato che condividere le mie scoperte e i riferimenti pertinenti sarebbe stata un'opzione migliore per tutti.


molto grazie questo mi aiuti; pd: felice anno nuovo
Alejandro Diego

È bello vedere che Anwer ti ha aiutato. Cosa pd:significa?
C0de Dedalo

pd è postdatato.
Alejandro Diego,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.