2014-01-08 6 views
6

Gibt es eine Möglichkeit, einen Container vertikal zu zentrieren, wenn er beim Drucken auf eine neue Seite gestoßen wird?CSS-Zentriercontainer auf gedruckten Seiten bei Seitenumbruch

Wie das Diagramm zeigt, kann Container A zu groß werden, so dass A und B ihre eigenen Seiten belegen. Wenn das passiert, möchte ich, dass B oder beide zentriert sind.

+----------------+  +----------------+ +----------------+ 
| +------------+ |  |    | |    | 
| |   | |  | +------------+ | |    | 
| |  A  | |  | |   | | |    | 
| |   | |  | |   | | | +------------+ | 
| +------------+ |  | |   | | | |   | | 
|    | +---> | |  A  | | | |  B  | | 
| +------------+ |  | |   | | | |   | | 
| |   | |  | |   | | | +------------+ | 
| |  B  | |  | |   | | |    | 
| |   | |  | +------------+ | |    | 
| +------------+ |  |    | |    | 
+----------------+  +----------------+ +----------------+ 

Wir verwenden wkhtmltopdf, um die PDFs zu generieren. In unserem Fall genügt es, aus dem PDF zu drucken. Aber soweit ich weiß, unterstützt wkhtmltopdf keine Zentrierung wie diese. Ich frage mich, ob dies über CSS und/oder Javascript erreicht werden kann.

Eine Idee ist, die Höhe des Containers zu berechnen und den entsprechenden oberen Rand in JS einzustellen. Aber das erfordert die Kenntnis, wann/wenn der Container auf die nächste Seite verschoben wird, nehme ich an?

+0

Sie haben nicht beschrieben, von wo Sie drucken möchten.Angenommen, Sie möchten über den Browser drucken, würde ich nein sagen, da CSS für die Druckmedien in fast allen gebräuchlichen Browsern sehr fleckig ist. princexml sollte jedoch Ihre Anfrage unterstützen, und dies ist die Route, die wir für unser ähnliches Problem gewählt haben: Wir stellen einfach einen Link zum Herunterladen eines PDFs bereit, das aus dem HTML der tatsächlichen Seite generiert wird, und erstellen das PDF auf der Serverseite mit princexml. Leider bedeutet dies auch, dass Sie sich nicht automatisch an die Seitengröße des aktuellen Druckers anpassen können. –

+0

@bertbruynooghe Wir verwenden [wkhtmltopdf] (http://code.google.com/p/wkhtmltopdf/), um die PDFs zu erstellen. Soweit ich weiß, gibt es keine Möglichkeit dafür. In unserem Fall genügt es, aus dem PDF zu drucken. Ich werde mir princexml ansehen. Vielen Dank! – Dan7

Antwort

0

Soweit ich weiß, unterstützen Browser derzeit nichts dergleichen. Das Problem hierbei ist, dass der Browser nichts darüber weiß, wie die Hardware für tausende verschiedene Drucker funktioniert.

Es sei denn, das Betriebssystem stellt jedem Drucker API zur Verfügung, was nie passieren wird.

+0

Eine Idee ist, die Höhe des Containers zu berechnen und den entsprechenden oberen Rand in JS einzustellen. Aber das erfordert die Kenntnis, wann/wenn der Container auf die nächste Seite verschoben wird, nehme ich an? – Dan7

0

das ist ein langer Schuss, aber Sie können js dazu verwenden.

Berechnen Sie die Containergröße. Sie kennen die Papiergröße bereits.

Also alles, was Sie tun müssen, ist

„page-break-after: immer“ add

, wenn beide Ihre Elemente werden nicht auf der gleichen Seite mit dem zweiten Element passen und dann hängen Sie einfach Marge an den jeweils Element von

calcuated_value = mit (total_size - element_size)/2

$ (‘element_name.) css ("margin:" + calculated_value "+" auto;")

hoffe das funktioniert.

1

Es sieht so aus, als ob der Browser keinen Unterschied zwischen Ihrem Bildschirm und einem Blatt Papier macht: Er kennt die Größe jedes Mediums.

Demo here, getestet in Firefox und Chrome.

Ich versuchte mit einer einfachen Zentrierungstechnik (height:100% und vertical-align:middle in einer Tabelle) und es funktioniert perfekt. Das einzige Problem ist, dass alle Container jeweils eine Seite belegen.

Sie können die Arten festgelegt nur für den Drucker, der Art wie folgt aus:

@media print { 
    html, body, .page { 
     height: 100%; 
     padding: 0; 
     margin: 0; 
    } 
} 
0

Hier ist, wie ich dieses Problem gelöst:

html, body{margin: 0; padding: 0;} 
.page{box-sizing: border-box; height: 100%; width: 100%; border: 1px solid transparent; page-break-after: always;} 
.page-middle{height: 100%; width: 100%; display: table;} 
.page-middle-inner{height: 100%; width: 100%; display: table-cell; vertical-align: middle;} 

Wie Sie ich Grenze verwendet werden bemerkt haben: 1px durchsichtig transparent; . Ich kann es wirklich nicht erklären, aber aus irgendeinem Grund, wenn ich diesen Rand entferne, gehen einige Seiten auf eine andere Seite.

+0

Hallo, ich versuche eine Lösung basierend auf Ihrer Antwort zu implementieren, aber es kann nicht ganz funktionieren. Könnten Sie bitte den entsprechenden HTML-Code posten? –

+0

ich nicht, dass Code habe mehr, aber es hat so etwas wie dieser

Vedmant

+0

Dank sein, habe ich es jetzt an der Arbeit! –