Search code examples
javascriptphphtmllinuxwkhtmltopdf

Execute Javascript in PDF


I am converting the html to pdf using wkhtmltopdf and conversion is working completely fine using below code:

shell_exec('wkhtmltopdf http://www.example.com/Haryana.htm Haryana.pdf');

Now, suppose there are some DIV's hidden in html file. Say,

In Haryana.htm

<div style="display:none;">Hello</div>

so, the word 'Hello' will also not print in the converted PDF(which is obvious).

What I need to do is to show all the hidden text to the converted PDF.

What I tried till now is, created a JS file say external-js.js which has code to show all the hidden DIV's

var elements = document.getElementsByTagName('DIV')
for (var i = 0; i < elements.length; i++){
    if (elements[i].style.display == 'none') {
           elements[i].style.display = 'block';
    }
}

and also applying this JS file while creating a PDF like below:

shell_exec('wkhtmltopdf --enable-javascript --run-script /var/www/html/search/external-js.js http://www.example.com/Haryana.htm Haryana.pdf');

Still, PDF is converting fine but hidden text are not visible.

Please help me to show all the hidden text in pdf. I hope i am able to clear the question.

Note: I can't make changes in the html files because we have thousands of files like this.

UPDATE : When added debug-javascript option and running the following code in putty

wkhtmltopdf --debug-javascript --enable-javascript --run-script /var/www/html/search/external-js.js http://www.example.com/Haryana.htm Haryana.pdf;

i am getting following output:

Loading pages (1/6)
Warning: undefined:0 SyntaxError: Invalid flags supplied to RegExp constructor.
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done

which have some warning. I am sure this warning is coming because of --run-script /var/www/html/search/external-js.js but why? I have added this as per the official documentation.

I am stuck with this...can anybody please help me out?


Solution

  • Finally, after done lots of R&D I get the solution :-). I was on the right track and what i did is instead of passing the JS script url, i just passed the whole script content to wkhtmltopdf.

    Here is the code:

    $script = 'var elements = document.getElementsByTagName(\'DIV\');
               for (var i = 0; i < elements.length; i++)
               {
                if (elements[i].style.display == \'none\') 
                {
                elements[i].style.display = \'block\';
                }
               }'; 
    
    shell_exec('wkhtmltopdf --run-script "'.$script.'" http://www.example.com/Haryana.htm Haryana.pdf');
    

    That's it :-)

    Might be some other user can face same problem in future so, i am posting this as answer.