Ahojte,
prosím Vás nemátě někdo zkušenosti s PHP knihovnou mPDF, která exportuje HTML,PHP stránky do PDF?....
nedaří se mi to rozhodit
abych to upresnil:
Debian 6 + LAMP
step 1) nakopiroval jsem slozku knihoven mPDF do /usr/share/php5/MPDF65
step 2) v souboru php.ini jsem zavedl cestu ke knihovne: include_path = ".:/usr/share/php5/MPDF56/"
step 3) v html strance jsem si vytvoril submit tlacitko:
<form action="/create-pdf.php" method="post" class="pdf" id="form-pdf">
<p><input type="submit" name="pdf" value="create PDF" /></p>
</form>
step 4) a nakonec vytvoril samotnou php stranku na kterou odkazuji v submitu(action), ktera obsahuje:
<?php
include('../mpdf.php');
$mpdf=new mPDF();
$mpdf->WriteHTML('<p>Hallo World</p>');
$mpdf->Output();
exit;
?>
step 5) restartoval LAMP server
step 6) vyzkoušel funkčnost, ale vygeneruje se mi blank (bílá) stránka
Pouzivame to v projektu postavenem na Nette, takze vlastni html stranky ziskame pomoci Latte sablony
Funguje mi tento postup:
$latte = Latte sablona
Naplneni sablony
$html = '<html><body>';
$html .= $latte->getHTML(); - tady si dej napr. to svoje '<p>Hallo World</p>' nebo jakykoliv jiny uzitecny obsah
$html .= '</body></html>';
$mpdf = ziskani instance mPDF (coz ti funguje, kdyz ziskas pdf ;-) )
$mpdf->resetMPDFInstance();
$mpdf->setCSS(file_get_contents(main.css'));
$mpdf->setHTML($html);
return $mpdf->getPDF();
Postup vymyslel kolega, ja to od nej pouze zkopiroval...
A nasledne ve volajici metode
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename=ha-loo_dobijeci_kupony_'.$this->customerCli->getCislo().'.pdf');
header("Content-Transfer-Encoding: binary");
header('Content-Type: '.$pdf->getContentType()); // $pdf obsahuje navratovou hodnotu z mpdf (tedy to $mpdf->getPDF(); )
echo $pdf->getData(); - tim poslu klientovi pdf dokument
Myslim si, ze ti tam proste chybi <html> a <body> :-)
Citace od: David kdy 12. 07. 2013, 23:15:07
Myslim si, ze ti tam proste chybi <html> a <body> :-)
To jsou odjakživa nepovinné HTML tagy a pokud mPDF není bazmek, tak by se měl s jejich nepřítomností vypořádat.
mpdf vypada jednoduseji ze sezere html, ale ja od nej dycky utekl ke "slozitejsimu" tcpdf. nebo druha varianta je wkhtmltopdf.
díky hoši...
já nesjem vůbec zkušený programátor naopak amatér, ale tipuji, že jsem to dělal špatně už z toho důvodu, že zápis volající mPDF jsem měl uplně oddělen od souboru kde se nachází html obsah který by se měl dostat do PDF.
V mém případě mám formulář který se odešlě sem:
<!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage">
<link href="images/ERKA-favIcon-64.png" rel="icon" type="image/png" />
<head>
<title>ERKA form</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
</head>
<body>
<?php
?>
<style type="text/css">
.outputForm {
float:left;
margin-right:15px;
margin-left:15px;
margin-top:5px;
margin-bottom:5px;
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 13px;
font-weight: bold;
}
.outputFormText {
float:left;
margin-left:5px;
margin-right:5px;
margin-top:5px;
margin-bottom:1px;
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 16px;
}
.outputFormImage-type-1 {
float:left;
margin-left:50px;
margin-right:10px;
margin-bottom:5px;
}
</style>
<div style="max-width: 595px; height: 1600px; margin-left: auto; margin-right: auto; background-color:white; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<?php
$kunde = $_POST['kunde'];
$adresse = $_POST['adresse'];
$I = $_POST['I'];
$type = $_POST['cabinetType'];
$abteilen = $_POST['abteilen'];
$breite = $_POST['breite'];
$tiefe = $_POST['tiefe'];
$hoehe = $_POST['hoehe'];
$shelf = $_POST['facheinlage'];
$sockel = $_POST['sockel'];
$deckel = $_POST['deckel'];
$door = $_POST['turen'];
$doorDirection = $_POST['door-direction'];
$locking = $_POST['ArtVerriegelung'];
$lockwasher = $_POST['lockwasher'];
$lock = $_POST['lockType'];
$mainKey = $_POST['Haupt-Schlussel-Anlage'];
$centralLock = $_POST['ZentralschlossAnlage'];
$backside = $_POST['backSide'];
$colorKorpus = $_POST['colors-korpus'];
$colorDoor = $_POST['colors-door'];
$numeration = $_POST['numeration'];
$tob = $_POST['tob'];
$sheetKorpus = $_POST['sheet-korpus'];
$sheetDoor = $_POST['sheet-door'];
{
// *********************************************************************** CUSTOMER ************************************************************** \\
echo '<div id="output-customer" style=" background-color:red; width:auto; height:auto; padding-left: 10px; padding-top:10px; padding-bottom:10px; margin-bottom:10px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; ">
<div style="background-color:#E8E8E8 ; width:200px; height:auto; padding-left: 10px; border-width:thin; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; ">
<p style="font-size:20px; margin-left:1px; margin-top:0px; margin-bottom:0px; ">Customer:</p> </br>
<p style="font-size:20px; margin-left:1px; margin-top:0px; margin-bottom:0px; ">' . $kunde . ' </p>
<p style="font-size:20px; margin-left:1px; margin-top:0px; margin-bottom:1px; ">' . $adresse . ' </p>
</div>
<img src="../images/logo/ERKA-logo.svg" style="float:right; margin-top: -100px; margin-right:10px; "></img>
</div>';
// ******************************************************************** TYPE of CABINET ********************************************************* \\
if ($type == "Z1E_I30_100" && $abteilen == "1") {
echo '
<div style="font-size: 10px; margin-left: 15px; margin-right: 15px; padding-left: 3px; padding-right: 3px; border-width: 2px; border-style: solid; ">
' . $type. ',' . $I . ',' . $doorDirection . ',' . $abteilen . ',' . $breite . ',' . $tiefe . ',' . $hoehe . ',' . $door . ',' . $locking . ',' . $lockwasher . ',' . $lock . ',' . $mainKey . ',' . $centralLock . ',' . $sockel. ',' . $deckel . ' , ' . $colorKorpus . ' , ' . $colorDoor. ' , ' . $numeration. ' , ' . $tob. ', ' . $sheetKorpus. ', ' . $sheetDoor. '</div>
<div class="outputForm" style="width:560px; height:300px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">SCHRANKE TYPE: </br>
<p style="font-size: 13px; margin-left: 1px; ">Garderobe Z1E I30 geschweiste</p>
<p style="font-size: 13px; margin-left: 1px; ">Türen einschlagend</p>
<p style="font-size: 13px; margin-left: 1px; ">Inneneirichtung: ' . $I . '</p>
<p style="font-size: 13px; margin-left: 1px; ">ABTEILEN: ' . $abteilen . '</p>
<p style="font-size: 13px; margin-left: 1px; ">Breite: ' . $breite . '</p>
<p style="font-size: 13px; margin-left: 1px; ">Tiefe: ' . $tiefe . '</p>
<p style="font-size: 13px; margin-left: 1px; ">Hoehe: ' . $hoehe . '</p></div>
<div class="outputFormImage-type-1">
<img src="/images/cabinets-de/parts/outputForm/Z1E_I30/Z1E_I30_100_1.svg" >
</div>
</div>
'; }
else if ($type == "Z1E_I30_100" && $abteilen == "2") {
echo '
<div style="font-size: 10px; margin-left: 15px; margin-right: 15px; padding-left: 3px; padding-right: 3px; border-width: 2px; border-style: solid; ">
' . $type. ',' . $I . ',' . $doorDirection . ',' . $abteilen . ',' . $breite . ',' . $tiefe . ',' . $hoehe . ',' . $door . ',' . $locking . ',' . $lockwasher . ',' . $lock . ',' . $mainKey . ',' . $centralLock . ',' . $sockel. ',' . $deckel . ' , ' . $colorKorpus . ' , ' . $colorDoor. ' , ' . $numeration. ' , ' . $tob. ', ' . $sheetKorpus. ', ' . $sheetDoor. '</div>
<div class="outputForm" style="width:560px; height:300px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">SCHRANKE TYPE: </br>
<p style="font-size: 13px; margin-left: 1px; ">Garderobe Z1E I30 geschweiste</p>
<p style="font-size: 13px; margin-left: 1px; ">Türen einschlagend</p>
<p style="font-size: 13px; margin-left: 1px; ">Inneneirichtung: ' . $I . '</p>
<p style="font-size: 13px; margin-left: 1px; ">ABTEILEN: ' . $abteilen . '</p>
<p style="font-size: 13px; margin-left: 1px; ">Breite: ' . $breite . '</p>
<p style="font-size: 13px; margin-left: 1px; ">Tiefe: ' . $tiefe . '</p>
<p style="font-size: 13px; margin-left: 1px; ">Hoehe: ' . $hoehe . '</p>
</div>
<div class="outputFormImage-type-2" style="">
<img src="/images/cabinets-de/parts/outputForm/Z1E_I30/Z1E_I30_100_2.svg" >
</div>
</div>
'; }
//**************************************************************************************************************** \\
//*****************************************************SOCKEL conditions****************************************** \\
//**************************************************************************************************************** \\
//*****************************************************SOCKEL 1 partition **************************************** \\
if ($sockel == "STD" && $abteilen == "1") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; ">
<div class="outputFormText">SOCKEL: ' . $sockel . '</div>
<div class="outputFormImage">
<img src="/images/cabinets-de/parts/outputForm/sockel/100/SO-STD-100-1.svg" >
</div>
</div>
';
}
else if ($sockel == "GIRO" && $abteilen == "1") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">SOCKEL: ' . $sockel . '</div>
<div class="outputFormImage">
<img src="/images/cabinets-de/parts/outputForm/sockel/100/SO-GIRO-100-1.svg" >
</div>
</div>
';
}
//**************************************************************************************************************** \\
//*****************************************************DECKEL conditions****************************************** \\
//**************************************************************************************************************** \\
//*****************************************************DECKEL 1 partition **************************************** \\
if ($deckel == "STD" && $abteilen == "1") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px; ">
<div class="outputFormText">DECKEL: ' . $deckel . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/deckel/deckel-STD-1.svg"></div>
</div>
';
}
else if ($deckel == "DEDL" && $abteilen == "1") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">DECKEL: ' . $deckel . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/deckel/deckel-DEDL-1.svg" ></div>
</div>
';
}
//**************************************************************************************************************** \\
//*****************************************************DOOR conditions****************************************** \\
//**************************************************************************************************************** \\
if ($door == "T2") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">DOOR: ' . $door . '</div>
<div class="outputFormImage"><img src="/images/cabinets-de/parts/outputForm/door/door-T2.svg" ></div>
</div>
';
}
else if ($door == "T3") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">DOOR: ' . $door . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/door/door-T3.svg" ></div>
</div>
';
}
else if ($door == "T4") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">DOOR: ' . $door . '</div>
<div class="outputFormImage"><img src="/images/cabinets-de/parts/outputForm/door/door-T4.svg" ></div>
</div>
';
}
else if ($door == "T5") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">DOOR: ' . $door . '</div>
<div class="outputFormImage"><img src="/images/cabinets-de/parts/outputForm/door/door-T5.svg" ></div>
</div>
';
}
else if ($door == "T6") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">DOOR: ' . $door . '</div>
<div class="outputFormImage"><img src="/images/cabinets-de/parts/outputForm/door/door-T6.png" ></div>
</div>
';
}
else if ($door == "T7") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">DOOR: ' . $door . '</div>
<div class="outputFormImage"><img src="/images/cabinets-de/parts/outputForm/door/door-T7.svg" ></div>
</div>
';
}
else if ($door == "T8") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">DOOR: ' . $door . '</div>
<div class="outputFormImage"><img src="/images/cabinets-de/parts/outputForm/door/door-T8.svg" ></div>
</div>
';
}
//**************************************************************************************************************** \\
//*****************************************************SHELF conditions****************************************** \\
//**************************************************************************************************************** \\
if ($shelf == "F1") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">FACHEINLAGE: ' . $shelf . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/shelf/shelf-F1.svg" ></div>
</div>
';
}
else if ($shelf == "F1-KSTH") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">FACHEINLAGE: ' . $shelf . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/shelf/shelf-F1-KSTH.svg" ></div>
</div>
';
}
else if ($shelf == "F2") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">FACHEINLAGE: ' . $shelf . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/shelf/shelf-F2.svg" ></div>
</div>
';
}
else if ($shelf == "F2-KSTH") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">FACHEINLAGE: ' . $shelf . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/shelf/shelf-F2-KSTH.svg" ></div>
</div>
';
}
else if ($shelf == "F3") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">FACHEINLAGE: ' . $shelf . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/shelf/shelf-F3.svg" ></div>
</div>
';
}
else if ($shelf == "F3-KSTH") {
echo '
<div class="outputForm" style="width:260px; height:180px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">FACHEINLAGE: ' . $shelf . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/shelf/shelf-F3-KSTH.svg" ></div>
</div>
';
}
//**************************************************************************************************************** \\
//*****************************************************BACKSIDE conditions****************************************** \\
//**************************************************************************************************************** \\
if ($backside == "DL" && $abteilen == "1") {
echo '
<div class="outputForm" style="width:260px; height:200px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">RÜCKWAND: ' . $backside . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/backside/backSide-G_DL-1.svg" ></div>
</div>
';
}
else if ($backside == "DL" && $abteilen == "2") {
echo '
<div class="outputForm" style="width:260px; height:200px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">RÜCKWAND: ' . $backside . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/backside/backSide-G_DL-2.svg" ></div>
</div>
';
}
else if ($backside == "DL" && $abteilen == "3") {
echo '
<div class="outputForm" style="width:260px; height:200px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">RÜCKWAND: ' . $backside . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/backside/backSide-G_DL-3.svg" ></div>
</div>
';
}
else if ($backside == "DL" && $abteilen == "4") {
echo '
<div class="outputForm" style="width:260px; height:200px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">RÜCKWAND: ' . $backside . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/backside/backSide-G_DL-4.svg" ></div>
</div>
';
}
if ($backside == "LE" && $abteilen == "1") {
echo '
<div class="outputForm" style="width:260px; height:200px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">RÜCKWAND: ' . $backside . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/backside/backSide-G_LE-1.svg" ></div>
</div>
';
}
else if ($backside == "LE" && $abteilen == "2") {
echo '
<div class="outputForm" style="width:260px; height:200px; border-width: 1px; border-style: solid; -webkit-border-radius: 10px; -moz-border-radius: 10px; border-radius: 10px;">
<div class="outputFormText">RÜCKWAND: ' . $backside . '</div>
<div class="outputFormImage"> <img src="/images/cabinets-de/parts/outputForm/backside/backSide-G_LE-2.svg" ></div>
</div>
';
}
}
?>
</div>
</body>
</html>
ale kam přesně mám zapasovat bloky pro mPDF mi uplně jasné není
děkuji
Hele nakonec jsme přešli z mpdf na phantomjs. Časem narazíš na spoustu věcí (float, pozicování, marginy), co mpdf zobrazí jinak/špatně.
Phantom funguje tak, že si na serveru webkitem vyrenderuje page (nepotřebuješ X), vyfotí ji a uloží do pdf/png. Máš u toho jistotu, že víš jak se to renderuje (jako chrome), takže se nemusí dělat mpdf-related hacky..
dival jsem se na ten PhantomJs a pustil si také toto video:
http://www.youtube.com/watch?v=omUoFGMxRPI
původně jsem myslel, že to bude tak jak píšeš "že si ofotí celou html page a exportne do pdf", ale to asi nebude uplně pravda
existuje tedy metoda, která by tu stránku skutečně vzala tak jak je a udělal PDF?
vyřešeno...nyní mPDF šlape jak má...celej problem byl v cestách k mpdf
namísto include('../mpdf.php'); jsem zapsal include('MPDF56/mpdf.php');
čau hoši...
nyní už se mi daří generovat PDFka, ale mám podivnej problém ohledně css floatingu viz následující link:
http://193.165.148.74/mpdf_floating.jpg (http://193.165.148.74/mpdf_floating.jpg)
nemáte někdo zkušenost s používáním mPDF a komplikovanějších css?
díky za každou radu