Ich habe viele Möglichkeiten ausprobiert, um die Tabelle an die Seite (A4) anzupassen, wie auf dem Bild gezeigt: Ich habe viel gesucht, aber im Web nichts Nützliches gefunden. Ich verwende eine dynamische Tabelle, bis auf die Breite der Tabelle ist alles in Ordnung. Hier ist mein Code:
$content = '<table><thead><tr><th class="bg-dark text-white" align="center">#</th><th align="center" class="bg-dark text-white">Code</th><th align="left" class="bg-dark text-white">Description</th><th align="center" class="bg-dark text-white">Item Type</th></tr></thead><tbody><tr style="background-color: #f2f2f2;"><td align="center">1</td><td align="center">1001</td><td align="left">Pofak</td><td align="center">Fixed Price</td></tr><tr ><td align="center">2</td><td align="center">1002</td><td align="left">Ice</td><td align="center">Weight</td></tr><tr style="background-color: #f2f2f2;"><td align="center">3</td><td align="center">1003</td><td align="left">Minoo</td><td align="center">Fixed Price</td></tr><tr ><td align="center">4</td><td align="center">1004</td><td align="left">Bastani</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">5</td><td align="center">1005</td><td align="left">Chocolate</td><td align="center">Weight</td></tr><tr ><td align="center">6</td><td align="center">1006</td><td align="left">Brush</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">7</td><td align="center">1007</td><td align="left">Apple</td><td align="center">Weight</td></tr><tr ><td align="center">8</td><td align="center">1008</td><td align="left">Water</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">9</td><td align="center">1009</td><td align="left">Cleaner</td><td align="center">Fixed Price</td></tr><tr ><td align="center">10</td><td align="center">1001</td><td align="left">Pofak</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">11</td><td align="center">1002</td><td align="left">Ice</td><td align="center">Weight</td></tr><tr ><td align="center">12</td><td align="center">1003</td><td align="left">Minoo</td><td align="center">Fixed Price</td></tr><tr style="background-color: #f2f2f2;"><td align="center">13</td><td align="center">1004</td><td align="left">Bastani</td><td align="center">Fixed Price</td></tr><tr ><td align="center">14</td><td align="center">1005</td><td align="left">Chocolate</td><td align="center">Weight</td></tr><tr style="background-color: #f2f2f2;"><td align="center">15</td><td align="center">1006</td><td align="left">Brush</td><td align="center">Fixed Price</td></tr></tbody></table>';
$newContent = '
<style type="text/css">
table{width:100%;}
table, table td, table th{
border-collapse: collapse;
border: solid 1px #ababab;
}
.text-dark, table td{
color: #343a40;
}
.text-white{
color: #ffffff;
}
table td,
table th {
font-size: 11px;
padding: 3px;
line-height: 1.2;
font-family:arial;
}
.bg-dark {
background-color: #343a40;
}
.bg-secondary {
background-color: #6c757d;
}
.bg-white {
background-color: #ffffff;
}
.text-left {
text-align: left;
}
.text-right {
text-align: right;
}
.text-center {
text-align: center;
}
</style>
';
$newContent .= '<page>'.$content.'</page>';
try {
$html2pdf = new Html2Pdf('P', 'A4', 'en', true, 'UTF-8', 5);
$html2pdf->pdf->SetDisplayMode('real');
$html2pdf->writeHTML($newContent);
$PDFName = "ItemLists_".date('Y.m.d_H.i.s').".pdf";
$html2pdf->output($PDFName, 'I');
} catch (Html2PdfException $x) {
$html2pdf->clean();
$formatter = new ExceptionFormatter($x);
echo $formatter->getHtmlMessage();
}
Danke vielmals
style="width: 100%"
speichert die korrekt konvertierte Breite in MM (obwohl das width-Attribut dies nicht tut!). Html2PDF scheint sie jedoch beim Rendern von Tabellen nicht tatsächlich zu verwenden.Antworten:
Html2PDF verwendet nicht das HTML-Parser / Render-System von TCPDF. Es implementiert seine eigenen und die Implementierung vergrößert die Spalten nicht automatisch, um 100% des Speicherplatzes auszufüllen.
Daher müssen Sie in Html2PDF nicht nur 100% Breite für die Tabelle festlegen, sondern auch prozentuale Breiten für jede der Zellen festlegen. (Und aufgrund eines merkwürdigen Verhaltens mit dem
width
Attribut in Html2PDF verwenden Sie CSS, um die Breiten festzulegen.)TCPDFs native
writeHTML
setzt jede Spalte auf die gleiche Breite, sofern keine anderen Spezifikationen vorliegen . (In einer 4-Spalten-Tabelle sind beispielsweise alle Zellen zu 25% vorhanden.) Das von Ihnen verwendete CSS wird jedoch nicht unterstützt, sodass für das Markup einige Anpassungen erforderlich sind, um diesen Weg zu gehen.Um dieses grundlegende Verhalten in Html2PDF nachzuahmen, können Sie Ihren Zellen einfach explizit äquivalente Breiten hinzufügen. Fügen Sie beispielsweise Ihren
table td, table th
Stilregeln eine Breitenspezifikation hinzu .Hier ist ein Beispiel mit den folgenden CSS-Regeln für eine vierspaltige Tabelle:
Natürlich sieht es am besten aus, wenn Sie Breiten angeben, die zu Ihrem Inhalt passen.
AKTUALISIEREN
Ich werde einen Teil der Diskussion über TCPDF weiter unten verlassen, da dies etwas zur Schaffung einer potenziell nützlichen Klasse für führt
Html2pdf
. TCPDF bietet einige nützliche Methoden zum Messen der Länge eines Strings. Wenn Sie die Größe der Zeichenfolgen in den Spalten messen, können Sie Ihre eigene automatische Spaltengröße erstellen.Ich habe eine Proof-of-Concept-Klasse für Github unter https://github.com/b65sol/random-classes erstellt
Zuerst verwenden wir die Klasse, um die Konstruktion des HTML zu vermitteln. Auf diese Weise werden die Spaltenklassen zum Festlegen der Breiten hinzugefügt, und wir müssen HTML nicht analysieren, um den gemessenen Inhalt zu extrahieren.
Dann müssen wir eine Strategie für die Auswahl unserer Spaltenbreiten auswählen. In der folgenden Demo werden beispielsweise die Spalten gemessen und die prozentualen Mindestbreiten für jede Spalte basierend auf dem längsten Wort ermittelt. (Vermeidet Wortbrüche) Verteilt dann jeden zusätzlichen Speicherplatz proportional basierend auf dem Unterschied zwischen dem längsten Wort und dem längsten vollständigen Zelleninhalt. Ich würde diese Produktion nicht als fertig bezeichnen, da es sich um einen Proof-of-Concept handelt, aber ich hoffe, dass Sie (oder andere Suchende) sie als nützlichen Ausgangspunkt finden.
Der Schlüsselteil dafür ist folgender:
$tablebuilder->determine_column_widths_by_minimum_strategy('100%', 'aaa')
Der erste Parameter gibt uns die Größenreferenz an, mit der wir arbeiten (100% der Seite, da ich diese benötigte, um die Messungen nützlich zu machen), und der zweite enthält einige voreingestellte Füllzeichen, die zu unseren Messungen hinzugefügt werden können, um Textstil und Tabelle zu berücksichtigen Polsterungsunterschiede.
Hier ist eine Demo davon: https://b65sol.com/so/59517311_new.php
Die Klasse selbst ist hier verfügbar: https://github.com/b65sol/random-classes
Der Code für diese Demo ist hier:
ENDE DES UPDATE
Wenn Sie die Breiten nicht explizit angeben möchten, können Sie TCPDFs
writeHTML
anstelle derHtml2PDF
Bibliothek verwenden. Sie müssen jedoch nur gleich große Spalten verwenden. Ich dachte tatsächlich, es würde eine Neuberechnung der Spaltengrößen bewirken, wenn Sie nur eine oder zwei angeben würden, aber ich war falsch. Darüber hinaus weist TCPDF einige der gleichen Einschränkungen auf wieHtml2PDF
- Wenn Sie die Größe einer Spalte angeben, wird die Größe der anderen Spalten nicht automatisch angepasst.Außerdem werden Spalten nicht wie bei einem Browser an den Inhalt angepasst. Das ist eigentlich ziemlich schwer zu machen, also bin ich nicht überrascht, dass TCPDF es nicht versucht. Eine potenziell mühelose Lösung wäre, Ihre Spalten mit einem Größenanteil zu versehen und die Breite im laufenden Betrieb für jede Spalte zu berechnen, je nachdem, wie viele Spalten jeder proportionalen Größe ausgewählt sind. (z. B. sind numerische Spalten 'klein', und eine Beschreibungsspalte wäre 'groß', sodass zwei kleine Spalten zu je 10% und eine einzelne Beschreibung zu 80% aufgeteilt werden. Zwei kleine Spalten zu 5% und große Spalten zu 45%. jeweils. Es würde einige Experimente erfordern.)
quelle
table th, table td { <?=floor(100 / count($cols))?>%;}
aber ich suche nach einer besseren LösungHtml2PDF
bist du? Alle meine Lektüre des Codes und der Beispiele legen nahe, dass dies der einzige Weg ist. TCPDF kann dies mit einer etwas weniger leistungsfähigen CSS-Analyse tun, verfügt jedoch über ein besseres Layoutsystem. Ich kann Markup für TCPDF vorschlagen.table th, table td { <?=floor(100 / count($cols))?>%;}
Html2PDF
oder wie esTCPDF
scheint.determine_column_widths_evenly
, mit der Sie einige bekannte Größen angeben und den verbleibenden Speicherplatz gleichmäßig verteilen können.Die Arbeit mit der serverseitigen PDF-Datei eignet sich nicht für CSS. Haben Sie versucht, nur HTML zu verwenden?
Zum Beispiel:
Alternativ können Sie versuchen:
Hier ist ein CodePen, der dies im Browser demonstriert. https://codepen.io/tinacious/pen/PowJRbb
quelle
<table width="100%">
<table style="width:100%;">
<table class="w100">
<link rel="stylesheet" href="style.css" />
aber das Problem ist, dass es unter HTML gut funktioniert, aber wenn ich es als PDF speichern möchte, wird es wie das Bild sein.das Bild:
Ich denke, der beste Weg für diese Art von Tabellen ist folgende:
Auf TCPDF haben sie nichts Besonderes gemacht, die Tabelle passt sowieso nicht auf die Seite.
quelle