可以使用 Javascript 打开 PDF 文件的打印对话框吗?

IT技术 javascript pdf printing
2021-01-21 07:53:59

我知道如何在新窗口中打开网页并添加 javascript 以便弹出打印对话框。有没有办法对PDF文件做类似的事情?

6个回答

是的你可以...

PDF 具有 Javascript 支持。创建 PHP 生成的 PDF 时,我需要具有自动打印功能,并且我能够使用 FPDF 使其工作:

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

聚会迟到了,但是如何通过 3rd 方库实现这一点?
2021-03-14 07:53:59
至少,只需添加<script type="text/javascript">print();</script>到您的 PDF。(我正在使用 dompdf)
2021-04-05 07:53:59

我通常做一些类似于How to Use JavaScript to Print a PDF (eHow.com) 给出的方法,使用iframe.

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

    function printTrigger(elementId) {
        var getMyFrame = document.getElementById(elementId);
        getMyFrame.focus();
        getMyFrame.contentWindow.print();
    }
    
  2. 一个按钮,让用户访问...

    onClickabuttoninput或任何你想要的)

    <input type="button" value="Print" onclick="printTrigger('iFramePdf');" />
    
  3. 指向您的 PDF 的 iframe...

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

Bonus Idea #1 - 创建iframe并将其添加到您的页面中,printTrigger(); 以便在用户单击“打印”按钮之前不会加载 PDF,然后 javascript 可以攻击!iframe 并触发打印对话框。


奖励想法#2 - 如果您禁用“打印”按钮并在用户单击后给用户一些加载微调器或其他东西,以便他们知道某些东西正在处理中,而不是反复单击它,那么额外的功劳!

@jtietema 我相信,如果您将 PDF 作为整个且唯一的文档直接加载到浏览器中(即,不在 iframe 中),则contentWindow未定义。但是只要您在 iframe 中加载 PDF 并且从与父 DOM 相同的域加载,那么这应该可以正常工作。
2021-03-14 07:53:59
这是一个错误 Uncaught DOMException: Blocked a frame with origin "http://localhost:8080" from accessing a cross-origin frame.
2021-03-19 07:53:59
在 Google Chrome 中加载 PDF 时似乎没有定义 contentWindow
2021-03-21 07:53:59
此答案不再适用于 Firefox(当前为 v25)stackoverflow.com/questions/15011799/... 查看错误报告:bugzilla.mozilla.org/show_bug.cgi? id=911444
2021-03-26 07:53:59

刚刚弄清楚如何在 PDF 本身中执行此操作 - 如果您有 acrobat pro,请转到您的页面选项卡,右键单击第一页的缩略图,然后单击页面属性。单击窗口顶部的操作选项卡,然后在选择触发器下选择打开的页面。在选择操作下选择“运行 javascript”。然后在 javascript 窗口中,键入:

this.print({bUI: false, bSilent: true, bShrinkToFit: true});

这将在没有对话的情况下将您的文档打印到您机器上的默认打印机。如果您想要打印对话框,只需将 bUI 更改为 true,将 bSilent 更改为 false,并可以选择删除缩小以适应参数。

自动打印PDF!

这对我有帮助,但应该注意的是,根据文档,这也可以通过使用 printParams 对象来实现,这可能会派上用场,因为我在其他地方读到,如果 printParams 被传递,则打印方法会忽略所有其他参数(我需要它NumCopies 参数)
2021-03-22 07:53:59
只是为了记录,因为它让我发疯了;打印参数(bUI、bSilent、bShrinkToFit)记录在“使用 JavaScript 开发 Acrobat 应用程序”-“打印 PDF 文档”中:adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/...
2021-03-28 07:53:59
如果您使用printParams对象,Chrome PDF 插件不会显示打印对话框,但它会使用此答案中显示的 javascript。如果 Acrobat 正在执行 PDF 显示,则两者都可以工作。两者都不适用于 FireFox 20 和 21 的 PDFJS 显示代码。
2021-03-31 07:53:59

我使用named actionjavascript 代替,因为 javascript 经常被禁用,如果不是,它会发出警告。

我的 Web 应用程序创建了一个 postscript 文件,然后使用 ghostscript 将其转换为 pdf。我希望它自动打印,因为用户已经在我的应用程序中单击了打印。根据上面来自@DSimon 的命名操作的信息,我研究了如何解决这个问题。这一切都归结为/Type /Action /S /Named /N /Print在 pdf 中的正确位置插入字符串

我正在考虑编写一个小实用程序,但它必须解析 pdf 才能找到根节点,插入/OpenAction带有动作的对象的引用,并重新计算外部参照中的字节偏移。

但后来我发现了pdfmark,它是 postscript 的扩展,以 postscript 语法表达由 Adob​​es distiller 或 ghostscript 转换为 pdf 的习语。

由于我已经在使用 ghostscript,我所要做的就是将以下内容附加到我的 postscript 文件的末尾:

%AUTOPRINT
[ /_objdef {PrintAction} /type /dict /OBJ pdfmark
[ {PrintAction} << /Type /Action /S /Named /N /Print >> /PUT pdfmark
[ {Catalog} << /OpenAction {PrintAction} >> /PUT pdfmark

ghostscript 将创建动作、链接它并计算外部参照偏移。(附言中%是评论,PrintAction是我对该对象的名称)

通过查看 PDF 我看到它已经创建了这个:

1 0 obj
<</Type /Catalog /Pages 3 0 R
/OpenAction  9 0 R
/Metadata 10 0 R
>>
endobj

9 0 obj
<</S/Named
/Type/Action
/N/Print>>endobj

1 0是对象 1,修订版 0,9 0是对象 9,修订版 0。在 pdf-trailer 中说对象 1 是根节点。如您所见,对象 1 有一个引用,/OpenAction用于运行对象 9 修订版 0。

使用 ghostscript 可以将 pdf 转换为 postscript (pdf2ps),附加上面的文本,然后使用 .pdf 将其转换回 pdf ps2pdf应该注意的是,在此转换中丢失了有关 pdf 的元信息。我没有对此进行更多搜索。

嵌入代码示例:

<object type="application/pdf" data="example.pdf" width="100%" height="100%" id="examplePDF" name="examplePDF"><param name='src' value='example.pdf'/></object>

<script>
   examplePDF.printWithDialog();
</script>

可能不得不在 ids/names 上鬼混。使用 adobe 阅读器...

对于阅读本文的人:正确的函数名称是带有大写 P 的“Print()”。在这个例子中,正确的调用是 examplePDF.Print()
2021-03-14 07:53:59
类型错误:对象没有方法“printWithDialog”
2021-03-31 07:53:59