aaxc Posted February 19, 2014 Report Share Posted February 19, 2014 Tātad, ir radusies dīvaina problēma. Vajag nokonvertēt HTML ar CSS stylesheet uz PDF. Mēģināju sākumā ar tcpdf un tagad ar mpdf.Ir uzlikts ir MPDF 5.7: require_once 'MPDF/mpdf.php'; $mpdf = new mPDF(); $html = file_get_contents( 'test_html.html' ); $mpdf->WriteHTML( $html ); $mpdf->Output(); PDF uzģenerējas ar visām bildēm, tabulām etc., bet CSS stylesheets tiek ignorēts ( ir izveidoti full path )Tad mēģināju manuāli pievienot CSS: require_once 'MPDF/mpdf.php'; $mpdf = new mPDF(); $html = file_get_contents( 'test_html.html' ); $stylesheet = file_get_contents( 'print.css' ); $mpdf->WriteHTML( $stylesheet, 1 ); $mpdf->WriteHTML( $html, 2 ); $mpdf->Output(); Outputs interesants: Respektīvi, CSS fails tiek nolasīts un pievienots kautkur pa vidu kontentam kā outputs... kāpēc? PS: Paņēmu arī vienu maksas skriptu izmēģināt: https://pdfcrowd.com/ require 'pdfcrowd.php'; try { // create an API client instance $client = new Pdfcrowd("dainis", "c6bc244917e332841a196789ad23b08a"); // convert a web page and store the generated PDF into a $pdf variable $pdf = $client->convertFile("test_html.html"); // set HTTP response headers header("Content-Type: application/pdf"); header("Cache-Control: no-cache"); header("Accept-Ranges: none"); header("Content-Disposition: attachment; filename=\"test.pdf\""); // send the generated PDF echo $pdf; } catch(PdfcrowdException $why) { echo "Pdfcrowd Error: " . $why; } Strādā ideāli, tākā HTML un CSS ir korekts. Ir kāds saskāries ar šādu problēmu un/vai ir ieteikumi, kas varētu būt par vainu? Quote Link to comment Share on other sites More sharing options...
EdgarsK Posted February 19, 2014 Report Share Posted February 19, 2014 ir n-tie php rīki kā to darīt, bet ja ir piekļuve serverim, iesaku palaist x serveri kurš palaidīs pārlūku un executos "Print to PDF" /usr/bin/xvfb-run --server-args="-screen 0, 1024x768x24" /usr/bin/wkhtmltopdf "TAVS_URL" "-L -T -B -R --dpi 300 -s A4 -q" > mypdf.pdf Quote Link to comment Share on other sites More sharing options...
aaxc Posted February 19, 2014 Author Report Share Posted February 19, 2014 Tieši to es šobrīd arī pētu paralēli: http://www.cyberciti.biz/open-source/html-to-pdf-freeware-linux-osx-windows-software/ A šamais normāli strādā? Negribas lieki serveri kustināt, ja nav pārliecības, ka no tā būs jēga. Pietam man webkit engine nav patreiz. Quote Link to comment Share on other sites More sharing options...
EdgarsK Posted February 19, 2014 Report Share Posted February 19, 2014 +- 2 sekundes un ir gatavs personīgi uzturu python socket kurā palaižu kad vajag public static function UrlToPdf($url, $target=null, $options=array(), $cooldown=2){ $request = '/usr/bin/xvfb-run --server-args="-screen 0, 1024x768x24" /usr/bin/wkhtmltopdf "%s" "%s"'; $args = ''; foreach($options as $name=>$value){ $args .= ($args?' ':'').$name.' '.$value; } $tmp = DOCROOT.'public/tmp/'.uniqid().'.'.uniqid(); while(is_file($tmp)){ $tmp = DOCROOT.'public/tmp/'.uniqid().'.'.uniqid(); } $request = sprintf($request, $url, $tmp).($args?' '.$args:''); $request .= '; chown spy:spy '.$tmp; $request .= '; chmod 0777 '.$tmp; $dump = Python_Api::Execute('127.0.0.1', $request); sleep($cooldown); if(!is_file($tmp)){ return ''; } $data = file_get_contents($tmp); @unlink($tmp); if(!is_null($target)){ file_put_contents($target, $data); }else{ return $data; } } un izsaucu ar $domain = 'http://www.bbc.co.uk'; $pdf = Python_Local::UrlToPdf($domain, null, array( '-L' => 0, '-T' => 0, '-B' => 0, '-R' => 0, '--dpi' => 300, '-s' => 'A4', '-q' => '' )); header("Content-type: application/pdf"); header("Content-Length: ".strlen($pdf)); header("Content-disposition: inline; filename=".get_domain_original_base_name($domain).'.pdf'); header("Accept-Ranges: ".strlen($pdf)); echo $pdf; exit; Quote Link to comment Share on other sites More sharing options...
aaxc Posted February 19, 2014 Author Report Share Posted February 19, 2014 Paldies, izpētiju šo variantu un izmantošu. Vēl tikai uz full HTML5 ar CSS3 izteiktām fīcām jānotestē, bet tas jau pašam intereses pēc. Quote Link to comment Share on other sites More sharing options...
EdgarsK Posted February 20, 2014 Report Share Posted February 20, 2014 (edited) Few tips: 1. tiek printēts media type "print" vai "all" ja nav norādīts "print" (php.lv piemērs) 2. cooldown mainīgo iestati sekundēs cik lapa ģenerējas + 0.5 printēšanas laiks 3. tiks lietots os default pārlūks (google piemers parada ka tu nelieto chrome) 4. for some reason lapas fona krāsu nevar mainīt, tāpēc kad content beidzās un vēl ir blank space tur būs balts fons; 5. javascript strādās, tāpēc (tvnet piemērs) pārliecinies ka nav nekādi overflow popupi tur - piemērs no google: http://www.kohs.co.uk/devel/print-to-pdf/examples/example-google.pdf - piemērs no šī posta: http://www.kohs.co.uk/devel/print-to-pdf/examples/example-phplv.pdf - piemērs no tvnet: http://www.kohs.co.uk/devel/print-to-pdf/examples/example-tvnet.pdf Edited February 20, 2014 by EdgarsK Quote Link to comment Share on other sites More sharing options...
aaxc Posted February 20, 2014 Author Report Share Posted February 20, 2014 Paldies, tur nav nedz popup nedz scripti, jo tā lapa jau pasen izmanto speciālu templeitu lai varētu smuki izdzrukāt. Tagad klients vienkārši izdomāja, ka drukāšanas vietā grib, lai piedāvā saglabāt kā PDF. Patreiz vienīgā minimālā problēma ir tanī, ka apache lietotājam nav tiesības izmantot CLI komandas, bet tur es uztaisīšu atsevišķu mini webservisu, kam padošu HTML un saņemšu PDF. Quote Link to comment Share on other sites More sharing options...
EdgarsK Posted February 20, 2014 Report Share Posted February 20, 2014 (edited) Hmm, izmanto stream? ķip python socket - palaid ar python lai griežas, blakus noliec shell skriptu kruš darīs visu maģiju (palabo pāris rindiņas lai atbilst tavam serverim) un ar php izsauc kad vajag ar php Edited February 20, 2014 by EdgarsK Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.