Unable to use PDFLib Adapter with latest dompdf 0.7.0 - php

I am using DomPDF with PDFLib as backend.
Recently I am trying to upgrade my application to use dompdf from 0.6.0 to 0.7.0.
But it is giving exception in following file :
https://github.com/dompdf/dompdf/tree/master/src/Adapter/PDFLib.php#L213
$families = $dompdf->getFontMetrics->getFontFamilies();
Exception :
[Dompdf\Exception, 0]
Invalid property: getFontMetrics
Can anyone let me know what is this error about ?
Below is the sample php script that I am trying to run :
<?php
require_once('dompdf/autoload.inc.php');
// reference the Dompdf namespace
use Dompdf\Dompdf;
use Dompdf\Options;
$options = new Options();
$options->set(array(
'pdfBackend'=>'PDFLib',
'defaultMediaType'=>'print',
'defaultPaperSize'=>'A4',
'defaultFont'=>'arial',
'enable_html5_parser'=>true,
'enable_font_subsetting'=>true
));
// instantiate and use the dompdf class
$dompdf = new Dompdf($options);
$dompdf->loadHtml('hello world');
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser
$dompdf->stream();

There are some bugs in 0.7.0 with regard to PDFLib. The next release should address those issues (commit 3fd379b addresses this particular issue). No release date is currently set, though I would expect to see it by this fall.
Relevant discussion is in issue #1222.

Related

DOMPDF omits second line in rendered PDF

A client of mine had a problem merging two pdf documents. When I looked into it, and ran the PDF file rendered by DOMPDF in a PDF validator, it outputs:
1.1: Header Syntax error, Second line must begin with '%' followed by at least 4 bytes greater than 127
Looking at a valid pdf, this is line 2: %ÓôÌá
The error does not originate from the html, as it occurs even with the default Hello World! example by DOMPDF:
require_once 'dompdf/autoload.inc.php';
// reference the Dompdf namespace
use Dompdf\Dompdf;
// instantiate and use the dompdf class
$dompdf = new Dompdf();
$dompdf->loadHtml('hello world');
// (Optional) Setup the paper size and orientation
$dompdf->setPaper('A4', 'landscape');
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser
$dompdf->stream();
Edit: Question is whether there is a way to make Dompdf create the missing line 2?
Should be said that the file can be opened and viewed but error arises when merging with another pdf file.

Dompdf error "No block-level parent found. Not good."

require_once("function/dompdf/dompdf_config.inc.php");
$dompdf = new DOMPDF();
foreach($modules as $module){
$output = "Hello " .$module['name'];
$dompdf->load_html($output);
$dompdf->render();
$output_pdf = $dompdf->output();
file_put_contents($dir . $name_modulo . ".pdf", $output_pdf);
}
Fatal error: Uncaught exception 'DOMPDF_Exception' with message 'No block-level parent found. Not good.'
Late to this thread, but based on the post at https://github.com/dompdf/dompdf/issues/902, I was able to fix this issue by removing spaces between <html><head>, </head><body>, and </body></html>
So, instead of having properly formated html code like this:
<html>
<head>
...
</head>
<body>
...
</body>
</html>
I deleted all the new lines or spaces between the tags, now it looks like this :
<html><head>
...
</head><body>
...
</body></html>
And everything is hunky-dory again
dompdf folder > dompdf_config.custom.inc.php file > try to uncomment the line
define("DOMPDF_ENABLE_HTML5PARSER", true);
Also replace unsupported html5 tags & attributes with supported one, clear html errors for better result
Just define
$dompdf->set_option('enable_html5_parser', TRUE);
I think it will fix the issue.
Or can edit the dompdf/dompdf_config.inc.php file
go to line no 322
change
def("DOMPDF_ENABLE_HTML5PARSER", false);
to
def("DOMPDF_ENABLE_HTML5PARSER", true);
go to configuration file dompdf_config.custom.inc.php and uncomment define("DOMPDF_ENABLE_HTML5PARSER", true); and check, basically it requires html5 parser enabled in your configuration file.
Just uncomment define("DOMPDF_ENABLE_HTML5PARSER", true); this line from dompdf_config.custom.inc.php this file.
You can find this file for codeigniter in vendor/dompdf/dompdf this directory.
If you have installed dompdf using composer require then defining the enable_html5_parser option using the set_option method works well if you don't want to modify the vendor folder
So add the following to each document that is creating an error
$dompdf->set_option('enable_html5_parser', TRUE);
For newer versions of Dompdf you can use this to enable the HTML5 parser:
use Dompdf\Options;
$options = new Options();
$options->set('isHtml5ParserEnabled', true);
$dompdf = new Dompdf($options);
I don't know why the answer regarding ("DOMPDF_ENABLE_HTML5PARSER", true) was voted down either. Because I spent over 30 hours trying to figure out why this was happening in my website, until I came across this solution. So I enabled the "DOMPDF_ENABLE_HTML5PARSER" by setting it to "TRUE" as noted above. And immediately the error regarding "No block-level parent found" was resolved and my scripts worked. Maybe the 2nd answer was voted down because it duplicated a previous answer (but cut a guy a break, why don't you? Maybe he didn't see it..). Or maybe the "downvoter" has an attitude problem.
I had the same problem with domPDF 0.8.3 on PHP 5.6 and I couldn't find neither dompdf_config.custom.inc.php nor dompdf_config.inc.php and didn´t work either; to solve my problem, I added body {display:block;} to my CSS and had not further problem.
I tried locating the white space or other spaces. didn't succeed, so
I just Minimized the HTML file that is a PDF template
it removed all the spaces, white spaces, etc
worked for me
You can enable the HTML5 parser as mentioned above or you can update the dompdf library. I found updating the dompdf library from 6.2 to 8.2 got past this error BUT if you are using Drupal like I am there's a little bit of trickery you have to do to get Drupal to recognize the newer version of the library (see here: https://www.drupal.org/project/print/issues/3010637 )
In my case, it is a bit different.
The pdf creation code was in the loop but the dom pdf object creation was above the loop. So when it is trying to create the pdf for the second time, I had seen the above error. To resolve it, each and every time I am creating a new object and it worked as expected.
Example:
(Code not working)
//Reference of Dompdf namespace
use Dompdf\Dompdf;
use Dompdf\Options;
//instantiate and use the Options class
$options = new Options();
$options->set('enable_html5_parser', true);
$dompdf = new Dompdf($options);
for($i = 0; $i < $count; $i++) {
//Create PDF
$dompdf->loadHtml($form_data);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$output = $dompdf->output();
file_put_contents($pdf_file_name, $output);
}
Working Code:
//Reference of Dompdf namespace
use Dompdf\Dompdf;
use Dompdf\Options;
//instantiate and use the Options class
$options = new Options();
$options->set('enable_html5_parser', true);
for($i = 0; $i < $count; $i++) {
$dompdf = new Dompdf($options);
//Create PDF
$dompdf->loadHtml($form_data);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$output = $dompdf->output();
file_put_contents($pdf_file_name, $output);
}

DOM PDF generate only 1 page pdf skip remaining content

I have the following code which uses DOM PDF Library for converting Html content to PDF file.
$dompdf = new DOMPDF();
$dompdf->set_paper(array(0,0,450,306));
$dompdf->load_html($html);
$dompdf->render();
$output = $dompdf->output();
file_put_contents($pdf_path, $output);
But it generates 2-3 pages based on the html content.
I wanted to limit it to single page only and skip the remaining content.
The easiest way is to render to image. The GD adapter allows you to specify the page you want to render.
dompdf 0.6.2 or earlier: set DOMPDF_PDF_BACKEND to "GD" which only renders the first page of the document.
dompdf 0.7.0 or later: $dompdf->set_option('pdfBackend', 'GD');. This release renders all pages and allows you to specify the page to output/stream (default is to send the first page).
If you really need to render only the first page to a PDF that's a bit more difficult. Though technically possible to do this only with dompdf I'd actually be inclined to fully render the PDF then use an external library to pull out just the first page.
For example, with libmergepdf you could do it like this:
use iio\libmergepdf\Merger;
use iio\libmergepdf\Pages;
use Dompdf\Dompdf;
$m = new Merger();
$dompdf = new Dompdf();
$dompdf->load_html('...');
$dompdf->render();
$m->addRaw($dompdf->output(), new Pages('1'));
file_put_contents('onepager.pdf', $m->merge());
(specific to dompdf 0.7.0, but code is nearly the same for 0.6.2)

How to include any php in Controller

I would like to call a php file inside the controller, but it appears an error like this:
Fatal error: Class 'AppBundle\Controller\DOMPDF' not found in ....
Here my code :
require_once(__DIR__.'/../../../../dompdf/dompdf_config.inc.php');
$dompdf = new DOMPDF();
$dompdf->load_html($html);
$dompdf->render();
$dompdf->stream('report_'.$name.'.pdf');
If anyone can help me? thanks
For utilize the DOMPDF PHP Library in a symfony2 project you can use the DompdfBundle. Following the instruction in the github page.
After the installation, you can use it as a service, as described in the doc:
$dompdf = $this->get('slik_dompdf');
// Generate the pdf
$dompdf->getpdf($html);
// Either stream the pdf to the browser
$dompdf->stream('report_'.$name.'.pdf');
Hope this help

Creating a new PDF by Merging PDF documents using TCPDF

How can I create a new document using other PDFs that I'm generating?
I have methods to create some documents, and I want to merge them all in a big PDF, how can I do that with TCPDF?
I do not want to use other libs.
TCPDF has a tcpdf_import class, added in 2011, but it is still "under development". If you don't want to use anything outside of TCPDF, you're out of luck!
But FPDI is an excellent addition to TCPDF: it's like an addon. It's as simple as this:
require_once('tcpdf/tcpdf.php');
require_once('fpdi/fpdi.php'); // the addon
// FPDI extends the TCPDF class, so you keep all TCPDF functionality
$pdf = new FPDI();
$pdf->setSourceFile("document.pdf"); // must be pdf version 1.4 or below
// FPDI's importPage returns an object that you can insert with TCPDF's useTemplate
$pdf->useTemplate($pdf->importPage(1));
Done!
See also this question:
TCPDF and FPDI with multiple pages
Why don't you use Zend_PDF, it 's really a very good way to merge file.
<?php
require_once 'Zend/Pdf.php';
$pdf1 = Zend_Pdf::load("1.pdf");
$pdf2 = Zend_Pdf::load("2.pdf");
foreach ($pdf2->pages as $page){
$pdf1->pages[] = $page;
}
$pdf1->save('3.pdf');
?>
Hi i think TCPDF is not able to merge pdf files.
You can try it with an shell command and
PDFTK Toolkit
So you dont have to use an other pdf library.
This thread is from 2009, but using existing PDFs in PHP is still an issue in 2020.
After Zend_PDF has been abandoned and TCPDI does not support PHP 7, FPDI currently seems one of the few working solutions left in 2020. It can be used with TCPDF and FPDF, so existing code keeps working. And it currently seems well maintained.
Check out FPDI and FPDF_TPL. This isn't a perfect solution, but you can basically use FPDF_TPL to create a template of your PDF file and the insert it into your PDF file.

Categories