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

时间:2009-03-26 21:45:05

标签: javascript pdf printing

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

10 个答案:

答案 0 :(得分:33)

是的,你可以......

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

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

答案 1 :(得分:30)

我通常使用iframe执行与How to Use JavaScript to Print a PDF (eHow.com)给出的方法类似的操作。

  1. 一个容纳打印触发器的功能......

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

    onClickabutton上的input或您想要的任何内容

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

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

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


    奖金创意#2 - 如果您停用“打印”按钮并在用户点击后向用户提供一些加载微调器或其他内容,则会获得额外的功劳,这样他们就可以知道正在处理的内容而非点击它反复!

答案 2 :(得分:13)

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

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

这将打印您的文档而无需与计算机上的默认打印机对话。如果需要打印对话框,只需将bUI更改为true,将bSilent更改为false,并可选择删除缩小以适合参数。

自动打印PDF!

答案 3 :(得分:9)

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

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

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

然后我发现了pdfmark这是postscript的扩展,用于在postscript语法中表达由Adobes酒糟或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将创建动作,链接它,并计算外部参照偏移。 (在postscript %中是注释,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),附加上面的文本,并使用ps2pdf将其转换回pdf。应该注意的是,关于pdf的元信息在此转换中丢失。我没有仔细研究过这个。

答案 4 :(得分:7)

嵌入代码示例:

<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 /名字。 使用adobe reader ...

答案 5 :(得分:4)

如果您知道PDF文件的结构(或者愿意花一点时间阅读规范),您可以这样做。

在Catalog对象的OpenAction字段中使用命名操作“Print”; “打印”操作没有记录,但Acrobat Reader和大多数其他主要读者都了解它。这种方法的一个很好的好处是你没有得到任何JavaScript警告。有关详细信息,请参阅此处:http://www.gnostice.com/nl_article.asp?id=157

为了使它更加闪亮,我添加了第二个Action,URI,指示读者返回发起请求的页面。然后我使用Next字段将此Action附加到第一个Named操作。将内容处置设置为“内联”时,这使得当用户单击打印链接时:

  1. 它在同一个标​​签页中打开Adobe Reader并加载文件
  2. 立即显示打印对话框
  3. 打印对话框关闭后(无论是“确定”还是“取消”),浏览器标签都会返回到网页
  4. 我只使用File和IO模块就可以轻松地在Ruby中完成所有这些更改;我打开了使用外部工具生成的PDF,然后将外部参照跟踪到现有的Catalog部分,然后使用包含我的特殊OpenAction行的更新Catalog对象以及新的Action对象将新部分附加到PDF上。

    由于PDF的增量修订功能,您无需对现有数据进行任何更改即可,只需在末尾附加一个部分。

答案 6 :(得分:3)

为什么不使用“操作”菜单选项来设置它?

执行以下操作:如果您有Acrobat Pro,请转到页面选项卡,右键单击第一页的缩略图,然后单击页面属性。单击窗口顶部的操作选项卡,然后在选择触发器下选择打开页面。在选择操作下,选择'执行菜单项'。点击添加按钮,然后选择'文件&gt;打印'然后确定。再次单击“确定”并保存PDF。

答案 7 :(得分:2)

如果您使用Ruby on Rails的prawn gem生成PDF,则可以使用以下附加gem来激活打印对话框:

prawn-print

答案 8 :(得分:-1)

另一种解决方案:

index.html

答案 9 :(得分:-7)

如果您将pdf嵌入网页并引用对象ID,则应该可以执行此操作。

例如。 在您的HTML中:

<object ID="examplePDF" type="application/pdf" data="example.pdf" width="500" height="500">

在你的javascript中:

<script>

var pdf = document.getElementById("examplePDF");

pdf.print();

</script>

我希望有所帮助。