【问题标题】:How to send a pdf file directly to the printer using JavaScript?如何使用 JavaScript 将 pdf 文件直接发送到打印机?
【发布时间】:2023-04-10 13:20:01
【问题描述】:

如何使用 JavaScript 将 PDF 文件直接发送到打印机?

我在一个论坛找到了两个答案:

<embed src="vehinvc.pdf" id = "Pdf1" name="Pdf1" hidden>
<a onClick="document.getElementById('Pdf1').printWithDialog()" style="cursor:hand;">Print file</a>

<OBJECT id = "Pdf2" name="Pdf2" CLASSID="clsid:CA8A9780-280D-11CF-A24D-444553540000" WIDTH="364" HEIGHT="290">
     <PARAM NAME='SRC' VALUE="file.pdf">
</OBJECT>
<a onClick="document.Pdf2.printWithDialog()">Print file</a> 

但我的问题是它只能在 IE 上运行,而不能在 Firefox 或 Chrome 上运行。

有什么解决办法吗?

【问题讨论】:

  • 这个问题是关于 Adob​​e Reader 的插件 API 的吗?
  • 我不认为这与 adobe reader 的插件有关。因为我在所有浏览器中都有相同版本的 adobe reader。但这段 JavaScript 代码仍然不能在 Internet Explorer 中工作。
  • @Jignesh Manek:我不相信你会为所有浏览器找到解决方案。您可以期待的最好的结果是打开打印对话框,老实说,这应该已经足够好了。作为用户,我最不想做的就是让我的打印机开始打印一些东西,而没有机会检查我的设置、纸张尺寸、托盘等。想想看……甚至是你的大多数各种应用程序、文字处理器、电子表格等也只需调用打印对话框。
  • @Sparky672:是的,你是真的。但使用此代码,Firefox 甚至不显示打印对话框..
  • @Jignesh Manek:那你到底想要什么?是否可以只在所有浏览器中打开打印对话框?此线程有更多信息:stackoverflow.com/questions/687675/…

标签: javascript html pdf printing


【解决方案1】:

我认为这个 JavaScript 库可能会对您有所帮助:

它叫Print.js

首先包含

<script src="print.js"></script>
<link rel="stylesheet" type="text/css" href="print.css">

基本用法是调用printJS(),传入一个PDF文档的url:printJS('docs/PrintJS.pdf')

我做的是这样的,如果PDF文档太大,这也会显示“正在加载...”。

<button type="button" onclick="printJS({printable:'docs/xx_large_printjs.pdf', type:'pdf', showModal:true})">
    Print PDF with Message
</button>

但请记住:

Firefox 目前不允许使用 iframe 打印 PDF 文档。在 Mozilla 的网站上有一个公开的bug 与此相关。使用 Firefox 时,Print.js 会将 PDF 文件打开到新选项卡中。

【讨论】:

  • 这个库可以用来绕过打印对话框打印 PDF 吗?
  • 你应该试一试,看看...!我不确定@W.M. !
  • @W.M.使用这个库可以绕过打印对话吗?
【解决方案2】:

您需要采取两个步骤。

首先,您需要将 PDF 放入 iframe。

  <iframe id="pdf" name="pdf" src="document.pdf"></iframe>

要打印 iframe,您可以在此处查看答案:

Javascript Print iframe contents only

如果您想在 PDF 加载后自动打印 iframe,您可以将 onload 处理程序添加到 &lt;iframe&gt;

  <iframe onload="isLoaded()" id="pdf" name="pdf" src="document.pdf"></iframe>

加载器可能如下所示:

function isLoaded()
{
  var pdfFrame = window.frames["pdf"];
  pdfFrame.focus();
  pdfFrame.print();
}

这将显示浏览器的打印对话框,然后只打印 PDF 文档本身。 (我个人使用 onload 处理程序来启用“打印”按钮,以便用户可以决定是否打印文档)。

我在 Safari 和 Chrome 中几乎逐字使用此代码,但尚未在 IE 或 Firefox 上尝试。

【讨论】:

  • 我在 Chrome、IE 和 Firefox 中尝试过这种方法,但它没有按预期工作。在 Chrome 中,我得到“pdfFrame.print 不是函数”。在 FF 中,我得到“错误:访问属性“打印”的权限被拒绝”。 IE 没有给出错误但不会触发打印对话框。 PDF 位于同一来源,并且 X-Frame-Options 设置为 SAMEORIGIN。这种方法是不是已经过时了?
【解决方案3】:

这实际上使用 dataURI 更容易,因为您可以在返回的窗口对象上调用 print。

// file is a File object, this will also take a blob
const dataUrl = window.URL.createObjectURL(file);

// Open the window
const pdfWindow = window.open(dataUrl);

// Call print on it
pdfWindow.print();

这会在新选项卡中打开 pdf,然后弹出打印对话框。

【讨论】:

  • 这是否适用于 xlsx 或 docx 等其他文件类型?
【解决方案4】:

试试这个:有一个按钮/链接打开一个网页(在一个新窗口中),其中只嵌入了 pdf 文件,然后打印网页。

在主页的头部:

<script type="text/javascript">
function printpdf() 
{
myWindow=window.open("pdfwebpage.html");
myWindow.close;  //optional, to close the new window as soon as it opens
//this ensures user doesn't have to close the pop-up manually
}
</script>

在主页的正文中:

<a href="printpdf()">Click to Print the PDF</a>

pdfwebpage.html内部:

<html>
<head>    
</head>

<body onload="window.print()">
<embed src="pdfhere.pdf"/>

</body>
</html>

【讨论】:

  • 这种方法对我来说似乎根本不起作用。 Chrome、IE 和 FireFox 的行为方式都相同 - 会出现一个打印对话框,但它只是打印带有小/不可见的嵌入式 PDF 的网页。我需要触发 PDF 打印,而不是网页打印。我错过了什么吗?
【解决方案5】:

一个容纳打印触发器的函数...

function printTrigger(elementId) {
    var getMyFrame = document.getElementById(elementId);
    getMyFrame.focus();
    getMyFrame.contentWindow.print();
}

一个授予用户访问权限的按钮...

(an onClick on an a or button or input or whatever you wish)

<input type="button" value="Print" onclick="printTrigger('iFramePdf');" />
an iframe pointing to your PDF...

<iframe id="iFramePdf" src="myPdfUrl.pdf" style="dispaly:none;"></iframe>

更多:http://www.fpdf.org/en/script/script36.php

【讨论】:

  • 再一次,它在 Firefox 和 Chrome 中什么也不做。在 IE 中进行测试时,主要的 html 文件内容被发送到打印机!
【解决方案6】:
<?php

$browser_ver = get_browser(null,true);
//echo $browser_ver['browser'];

if($browser_ver['browser'] == 'IE') {
?>

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>pdf print test</title>
<style>
    html { height:100%; }
</style>
<script>
    function printIt(id) {
        var pdf = document.getElementById("samplePDF");
        pdf.click();
        pdf.setActive();
        pdf.focus();
        pdf.print();
    }
</script>
</head>

<body style="margin:0; height:100%;">

<embed id="samplePDF" type="application/pdf" src="/pdfs/2010/dash_fdm350.pdf" width="100%" height="100%" />
<button onClick="printIt('samplePDF')">Print</button>


</body>
</html>

<?php
} else {
?>
<HTML>
<script Language="javascript">

function printfile(id) { 
    window.frames[id].focus();
    window.frames[id].print();
} 

</script>
<BODY marginheight="0" marginwidth="0">

<iframe src="/pdfs/2010/dash_fdm350.pdf" id="objAdobePrint" name="objAdobePrint" height="95%" width="100%" frameborder=0></iframe><br>

<input type="button" value="Print" onclick="javascript:printfile('objAdobePrint');">

</BODY>
</HTML>
<?php
}
?>

【讨论】:

  • OP 没有要求 PHP 解决方案。
  • 我的问题中的代码已经在 IE 上工作了。我想要修复 firefox 和 chrome !
猜你喜欢
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2023-01-10
  • 2018-09-27
相关资源
最近更新 更多