2013-03-08 15 views
11

Nella mia applicazione, l'utente può definire le proprie intestazioni e margini per la stampa. Per l'intestazione, l'utente può fornire i seguenti due campi:Intestazione altezza e intestazione di posizionamento dalla parte superiore della pagina in wkhtmltopdf

  • (a) pagina Margine superiore in mm (dalla parte superiore della pagina)
  • (b) Header Margin in mm (dalla parte superiore della pagina)

I campi (a) e (b) sono come mostrato nella figura seguente: Margins depiction

Ad esempio, se l'utente fornisce (a) come 10 millimetri e (b) come 100mm, quindi l'altezza della 'regione di intestazione' sarebbe 90 mm.

Ora il contenuto nell'intestazione deve essere allineato nella parte superiore della regione di intestazione.

C'è un modo per impostare l'altezza della regione di intestazione e allineare in alto il contenuto all'interno di questa regione di intestazione.

Attualmente, sto facendo la seguente per l'opzione intestazione html:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 

    <style type="text/css"> 
     body 
     { 
      border:0; 
      margin: 0; 
      padding: 0; 
      height: 90mm; //in actual program, this is set dynamically in PHP 
     } 
    </style> 

    <script type="text/javascript"> 
    function subst() 
    { 
     //process the GET parameters and accordingly set the Header Region text info 
    } 
    </script> 
</head> 

<body onload="subst()"> 
    <div> 
     //text 
    </div> 
</body> 
</html> 

L'opzione margin-top sia impostato come 100 mm.

Ho provato a fissare vertical-align: top per il corpo CSS, ma anche questo non ha funzionato.

L'output finale che ottengo non sembra avere il contenuto della regione di intestazione allineato verticalmente in alto o in mezzo. È da qualche parte un po 'al di sopra del centro della regione di intestazione.

+0

provare a utilizzare il flag wkhtmltopdf per 'spacing' oltre a' margin-top' – Unixmonkey

+0

@Unixmonkey: il contenuto dell'area dell'intestazione non ha una dimensione fissa. L'utente è libero di fornire qualsiasi no. di linee per il contenuto dell'intestazione. Quindi la spaziatura non può essere prefissata. Inoltre, non ho menzionato prima, anche la dimensione della carta è definita dall'utente. – mohitp

risposta

8

Edit: Questa correzione sembra essere richiesta solo quando wkhtmltopdf è installato in un sistema basato su Windows.

Dopo molti tentativi ed errori, ho osservato che la seguente logica sembra essere il lavoro:

  • Il corpo elemento di html-testa deve essere impostato ad un'altezza 1,33 volte l'effettivo altezza della regione di intestazione. (Perché? Non so. Ciò potrebbe essere dovuto ad alcuni metodi di rendering QT o wkhtmltopdf, ma in realtà funziona per tutti i casi, indipendentemente dalle righe nel contenuto della regione di intestazione).
  • L'immediato (e l'unico) elemento figlio del corpo è impostato per l'altezza al 100% e per nascondere il contenuto straripante

Quindi, il codice modificato (per l'esempio precedente) per html-head si presenta così:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8" /> 

    <style type="text/css"> 
     body 
     { 
      border:0; 
      margin: 0; 
      padding: 0; 
      height: 120mm; 
      /* 
      In the actual program this height is calculated dynamically in PHP as 
      ($headerMargin - $topMargin) * 1.33 
      */ 
     } 

     #master-div 
     { 
      overflow: hidden; 
      height: 100%; 
     } 

    </style> 

    <script type="text/javascript"> 
    function subst() 
    { 
     //process the GET parameters and accordingly set the Header Region text info 
    } 
    </script> 
</head> 

<body onload="subst()"> 
    <div id="master-div"> 
     //The actual content goes here 
    </div> 
</body> 
</html> 

ho verificato questo per atleast 7 a 8 diversi formati di carta (compresa l'impostazione personalizzata pagina a larghezza e pagina altezza.Controllato anche con diverse dimensioni del contenuto della regione dell'intestazione (da 1 riga a 20 righe).

L'unico problema è che questa logica di 1,33 volte l'altezza della regione dell'intestazione sembra funzionare solo se Margine testata (b)/Margine piedino è inferiore o uguale a un terzo dell'altezza della carta. Se l'altezza del margine va oltre, il contenuto viene ritagliato man mano che aumenta l'altezza del margine. Ma avere altezze di testa così grandi non sarebbe generalmente richiesto, immagino.

+0

Sono stato in grado di gestire il PDF utilizzando le conoscenze che hai fornito, ma sono ancora un po 'confuso riguardo i margini e il posizionamento. Inoltre, il mio PDF ha generato pagine vuote (solo con intestazioni), il che mi porta a credere che il contenuto stia spingendo qualcosa alla pagina successiva. – marquito

+0

Puoi approfondire i tuoi problemi? Si noti inoltre che il problema e la soluzione è solo quando si esegue wkhtmltopdf in una macchina Windows. Se l'hosting finale verrà eseguito su una macchina Linux, il problema precedente non si verifica. In tal caso (dove si sviluppa su Windows e si esegue l'hosting su Linux), si devono gestire entrambe le situazioni individualmente, cioè avere PHP/CSS diversi per ogni caso. Questo è ciò che ho fatto. – mohitp

+0

Sto lavorando su Windows, poiché la nostra soluzione è basata su ASP.NET. Tuttavia, sono riuscito a gestire un'intestazione corretta, anche se non sono ancora in grado di capire i numeri (potrei farlo dopo alcuni tentativi ed errori). Puoi vedere un esempio PDF qui: http://bit.ly/1acl3DW che è stato generato da ASP.NET usando il seguente comando: http://pastebin.com/KdMCv8VB – marquito

Problemi correlati