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

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);
}

Related

(Inline) PHP in domPDF 7.0

I switched from TCPDF to domPDF because it seems more convenient to handle when creating invoices from html to pdf (I am rather a low pro on PHP :)). Now that I created the html file as a PDF file I recognized it does not output any PHP in the PDF - since the data from my sql databanks should fill the PDF it is kinda a problem.
I saw that you can enable PHP in the options.php included in the src-folder and I tried to do like it is written in the manual (and also tried various other code lines) but it just doesn't want to work:
$root = realpath($_SERVER["DOCUMENT_ROOT"]);
require_once ("$root/../xxx/dompdf/autoload.inc.php");
use Dompdf\Dompdf;
use Dompdf\Options;
$options = new Options();
$options->setIsPhpEnabled('true');
$dompdf = new Dompdf($options);
$dompdf->loadHtml(file_get_contents("testdomhtml.php"));
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream("bla",array("Attachment"=>0));
The PDF is shown but without the input from any PHP code.
If someone would be so kind, I would also be interested in knowing why and in how far enabling PHP is a security risk since I actually want to use that for my business. Would it be more advisable to wrap it all up in the main php file without loading external html and css files?
Thanks a lot in advance!
You could do something like this (not tested the code). Replace
$dompdf->loadHtml(file_get_contents("testdomhtml.php"));
With
ob_start();
include 'testdomhtml.php';
$output = ob_get_clean();
$dompdf->loadHtml($output);
More options How to execute and get content of a .php file in a variable?
Your file_get_contents("testdomhtml.php") will get actual content of file and will not execute any code inside it. Instead make it web accessible and pass URL to this page:
$dompdf->load_html_file('http://yourdomain.ext/testdomhtml.php');

Unable to use PDFLib Adapter with latest dompdf 0.7.0

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.

HOW TO: convert HTML to PDF with PHP/DOMpdf?

I need your help to fix this:
My current code is this:
<?php
require_once '../dompdf/autoload.inc.php';
use Dompdf\Dompdf;
$dompdf = new Dompdf();
$html = 'Insert full HTML content';
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'landscape');
$dompdf->render();
$dompdf->stream("codexworld",array("Attachment"=>0));
?>
This is the error a get:
Why if I have exactly the same code like the basic example, am I getting this error? What am I missing? I don't find in my folder the Autoloader.php, where do I have to get that file?
Well apparently it's an issue after domPdf has moved to Github. It seems that php-font-lib library doesn't exist. So one solution is to manually download it:
Go to https://github.com/PhenX/php-font-lib and download the library.
In the zip file, take the contents of the src/FontLib/ folder and paste that into the folder lib/php-font-lib.
or you can check this answer here

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

DOM PDF renders on mac but not PC

I'm using DOM PDF to convert a simple html page to a PDF--everything works on mac, but on PC I get the message:
Is there a log I can check? What could make this work on mac (using preview) but not adobe on windows?
Edit
As bfavaretto suggested, I opened the PDF in textedit. Here's the error:
<p>Message: Function set_magic_quotes_runtime() is deprecated</p>
<p>Filename: lib/class.pdf.php</p>
<p>Line Number: 4332</p>
Here is my CI code:
function pdf($id)
{
// Setup fields
$this->load->helper('htm_to_pdf');
$data['data'] = $this->home_model->getReport(array('id'=>$id));
$html = $this->load->view('HTML2PDF/Code/index', $data, true);
pdf_create($html, 'filename');
}
set_magic_quotes_runtime is not used anymore in dompdf 0.6. I suggest you to download the latest version (0.6 beta 3) or to remove the set_magic_quotes_runtime call in lib/class.pdf.php.
It is a warning thrown by PHP because this function is deprecated.
Some wiki usage information
require_once("dompdf_config.inc.php");
$html_to_string = $this->load->view('', array(), true);
$dompdf = new DOMPDF();
$dompdf->load_html($html_to_string);
force_download('sample.pdf', file_get_contents($dompdf->render()));
-
Instead of force download you could use
$dompdf->stream("sample.pdf");
I've seen posts about similar issues (I had a bunch of issues with DOMPDF), it sounds like there is other text in the output stream that's causing specifically Acrobat to reject the PDF as corrupt.
Try adding setlocale(LC_NUMERIC, "C"); before you call DomPDF
Take a look at this thread for more info: http://code.google.com/p/dompdf/issues/detail?id=418

Categories