Jump to content
php.lv forumi

HTML + CSS konvertēšana uz PDF


aaxc

Recommended Posts

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:
 
u9gTazj.png
 
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?

Link to comment
Share on other sites

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

Link to comment
Share on other sites

+- 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;
Link to comment
Share on other sites

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 by EdgarsK
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...