Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP: Adobe Reader can't open PDF files created with mpdf

Tags:

html

php

pdf

mpdf

I'm using mpdf to create PDF files on the fly, and the files open fine in a browser but Adobe gives me an error:

Adobe Acrobat Reader DC could not open 'example-filename.pdf' because it is either not a supported file type or because the file has been damaged (for example, it was sent as an email attachment and wasn't correctly decoded).

I looked at other questions about this (another mpdf + adobe error), and checked out the pdf in a text editor. I found that the first part of the file looked like this:

<!DOCTYPE html>
<head>
    <title>
        CapstoneDB
    </title>
    %PDF-1.4
%âãÏÓ

After I removed everything up to %PDF-1.4 (including the tab), the file opened fine in Adobe, which is great, except that I need to be able to get the generated pdfs to open in Adobe without manually fiddling with the code every time.

Here's my wrapper function that calls mpdf with the html and css:

include('../mpdf/mpdf.php');

function user_download_pdf($html, $css_file, $filename) {
    $mpdf = new mPDF();
    $stylesheet = file_get_contents($css_file);
    $mpdf->WriteHTML($stylesheet,1);
    $mpdf->WriteHTML($html,2);
    $mpdf->Output($filename, "D");
}

I never feed mpdf a full html page, usually just an h3 and one or more tables. Maybe I need to be giving mpdf an entire html page, including <head>, <body>, etc? Is there any way to change mpdf configuration or the way I call mpdf in php that would get rid of the html junk at the beginning of the pdf file that's gunking everything up?

like image 842
Potato_potato Avatar asked Feb 08 '16 17:02

Potato_potato


1 Answers

Place

ob_clean(); 

immediately before

$mpdf->Output();

Without this mpdf sometimes includes the website page HTML and not just the HTML that you want in the PDF, probably because headers have already been sent elsewhere in the code. That can mess up your PDF so Adobe won't open it.

like image 182
Markol Avatar answered Oct 14 '22 05:10

Markol