In a Web application, is it possible to force a PDF file to be printed on the client? If the browser is configured to open the PDF inside the window, I guess that calling window.print() will work, but some browsers (like mine) are configured to open the PDF externally.
8 Answers
The way google docs does it is by embedding JavaScript into the PDF that tells Acrobat Reader or any other compliant reader to print it.
You would need a PDF toolkit to do this with a random PDF.

- 87,846
- 14
- 132
- 192
-
4You don't need PDF toolkit if you can use iTextSharp. Here is a link to a page tells you how to add javascript to the PDF using iTextSharp that will print the pdf. http://itextsharp.sourceforge.net/tutorial/ch11.html – Dave Dec 03 '09 at 19:21
-
40iTextSharp is a PDF toolkit. – Lou Franco Dec 04 '09 at 19:03
-
2checkout FPDF for PHP and this addon for FPDF: http://www.fpdf.de/downloads/addons/36/ – Brenden Jan 21 '12 at 00:26
-
1When using TCPDF adding `$pdf->IncludeJS('print(true);');` to your code opens print dialog (tested on Chrome and FF), see [Example 53 of TCPDF](https://github.com/tecnickcom/TCPDF/blob/master/examples/example_053.php). – qwertz Apr 14 '17 at 18:06
<html>
<script language="javascript">
timerID = setTimeout("exPDF.print();", 1000);
</script>
<body>
<object id="exPDF" type="application/pdf" data="111.pdf" width="100%" height="500"/>
</body>
</html>

- 67
- 1
- 1
-
3This doesn't work in a Firefox 9 with Adobe reader plugin (on Ubuntu). (`exPDF.print is not a function`). Where did you get it to work? – Paŭlo Ebermann Feb 03 '12 at 19:50
-
-
-
similarly to taeyoung's suggestion you can use an iframe to render the pdf and then use contentWindow.print();

- 4,283
- 1
- 39
- 61
-
Like for taeyoung's solution, this doesn't work in a Firefox 9 with Adobe reader plugin (on Ubuntu). (`exPDF.print is not a function`). Where did you get it to work? – Paŭlo Ebermann Feb 03 '12 at 19:55
-
I think this only works with webkit. The other browsers will just download it. – Aaron Renoir Feb 03 '12 at 20:59
-
Actually, Firefox shows the PDF in the iframe, and ignores the method call (the error message is visible on the JS console in Firebug). – Paŭlo Ebermann Feb 03 '12 at 22:52
-
this seems to work in ff9 on os x, $('#exPDF')[0].focus(); $('#exPDF')[0].contentWindow.print(); – Aaron Renoir Feb 03 '12 at 23:03
you can set a http header to application/pdf and then force a new window open with javascript and print that way. but who would really do that? i mean come on now.
you can use the simple amazing library printjs "http://printjs.crabbly.com" it takes PDF file and print it without showing print dialog if you need , a simple way to do it below :
<button type="button" onclick="printJS('docs/printjs.pdf')">
Print PDF
</button>

- 1,080
- 16
- 22
-
i was stoked on this one until i got a nice surprise in the console while testing on staging: "PrintJS currently doesn't support PDF printing in Firefox, Internet Explorer and Edge." lol – ryanrain Jul 05 '18 at 17:19
If you want to print a PDF via the browser's print dialog, you can render the PDF inside an iframe on which you call the print()
method.
// create iframe element
const iframe = document.createElement('iframe');
// create object URL for your blob or file and set it as the iframe's src
iframe.src = window.URL.createObjectURL(fileOrBlob);
iframe.name = 'pdf';
// call the print method in the iframe onload handler
iframe.onload = () => {
const pdfFrame = window.frames["pdf"];
pdfFrame.focus();
pdfFrame.print();
}
document.body.appendChild(iframe);
You can also set iframe.hidden = true;
to do all of this in a hidden iframe, which the user won't notice.
This solution should work with all major browser's except Legacy Microsoft Edge. If you need to be compatible with Legacy Microsoft Edge you can fall back to the npm package print-js: https://www.npmjs.com/package/print-js.

- 46
- 4
-
This answer actualy saved my life :) It is the only solution that worked for me for printing PDF-s. I'm trying to print PDF document unattended from Chrome or/and Firefox. Combined with kiosk mode (Chrome) or Firefoxes setting "print.always_print_silent" it simply works. Thank you, konnic :) – Martin Trampus Dec 20 '22 at 14:43
Do you mean that you want to force the file to be sent to a printer? Are you thinking of the Law of Unintended Consequences -- the user's device isn't connected to a printer? Could be a BlackBerry, could be a laptop on wi-fi. What if the user doesn't want it to go to the default printer?

- 32,337
- 7
- 60
- 92
-
-
1Spot on. Whenever I ask this kind of question then go ahead and implement it, it turns out I really should have wished for someone to point out what DOK pointed out. – Mihai Limbășan Dec 12 '08 at 21:52
-
18Yeah, but then your boss, who knows that only ten employees at his office will ever use this web page, and knows they have printers, will be baffled by the fact that you can make a computer do almost anything, but you cannot make it open a print dialog. – PeterAllenWebb Feb 03 '10 at 21:02
You can't print a PDF document directly from browser using Javascript. The Javascript function window.print() use the browser printing function and this is not what you need. You can achieve your aim starting the print through Java Web Start. Put your PDF document directly into the jnlp so you can run a Java program that recieve the raw PDF document as argument. Now you're running in the system and no longer in the browser, so you can directly interface with printing driver through JAVA API. This seem quite simple but really it's not because the JAVA printing API doesn't accept a file as input but a particular data structure that implements the ava.awt.print.Pageable interface.
Exist a web service at www.pdfprint.it that do all the work for you. Here a snippet taken from the official documentation.
<?php
// 1. GET the jnlp file with curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.pdfprint.it/printPdf?auth=XXXX");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //return the transfer as a string
$jnlp = curl_exec($ch);
curl_close($ch);
$pdfDoc ="example.pdf";
//2. put in the jnlp your PDF document base64 encoded
$jnlp = str_replace("####", base64_encode(file_get_contents($pdfDoc)),$jnlp);
//3. echo the jnlp file
header('Content-type: application/x-java-jnlp-file');
echo $jnlp;
You only need to get the jnlp file, put in your PDF document and send the jnlp to the browser. The JAVA program that run the printing will be dowloaded directly from the web service. You can also set some printing options as copies, sides, and so on

- 247
- 2
- 10