可以使用PDF文件';是否可以使用Javascript打开“打印”对话框?

可以使用PDF文件';是否可以使用Javascript打开“打印”对话框?,javascript,pdf,printing,Javascript,Pdf,Printing,我知道如何在新窗口中打开网页并添加javascript,以便弹出打印对话框。有没有一种方法可以对PDF文件执行类似的操作?如果您将PDF嵌入网页并引用对象id,您应该能够执行此操作 例如。 在HTML中: <object ID="examplePDF" type="application/pdf" data="example.pdf" width="500" height="500"> 在javascript中: <script> var pdf = docume

我知道如何在新窗口中打开网页并添加javascript,以便弹出打印对话框。有没有一种方法可以对PDF文件执行类似的操作?

如果您将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>

var pdf=document.getElementById(“examplePDF”);
pdf.print();
我希望这会有帮助。

是的,你可以

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

嵌入代码示例:

<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>

例如PDF.printWithDialog();
可能不得不在ID/名称上胡闹。
使用adobe reader…

刚刚了解了如何在PDF中实现这一点-如果您有acrobat pro,请转到“页面”选项卡,右键单击第一页的缩略图,然后单击“页面属性”。单击窗口顶部的“操作”选项卡,然后在“选择触发器”下选择“页面打开”。在选择操作下选择“运行javascript”。然后在javascript窗口中,键入以下内容:

this.print({bUI: false, bSilent: true, bShrinkToFit: true});
这将在没有对话框的情况下将您的文档打印到您机器上的默认打印机。如果需要“打印”对话框,只需将bUI更改为true,将bSilent更改为false,并可以选择删除“收缩到适合”参数


自动打印PDF

我通常使用
iframe
执行类似于所给出的方法

  • 包含打印触发器的函数。。。
  • 为用户提供访问权限的按钮。。。 (在
    a
    按钮
    输入
    上单击
    或任何您想要的)

    
    
  • 指向PDF的iframe。。。
    
    

  • 额外想法#1-创建
    iframe
    并将其添加到
    printTrigger()中的页面中
    这样在用户单击“打印”按钮之前不会加载PDF,javascript就可以进行攻击!单击iframe并触发打印对话框


    额外的想法#2-如果您禁用“打印”按钮,并在用户单击后给用户一点加载微调器或其他东西,这样他们就可以知道某些东西正在处理中,而不是重复单击它,那么您将获得额外的积分!

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


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

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

    在Catalog对象的OpenAction字段中使用命名操作“Print”;“打印”操作没有文档记录,但Acrobat Reader和大多数其他主要读者都理解它。这种方法的一个很好的好处是不会得到任何JavaScript警告。详情请参见此处:

    为了让它更引人注目,我添加了第二个操作URI,指示读者返回发起请求的页面。然后,我使用下一个字段将此操作附加到第一个命名的操作。将内容配置设置为“内联”时,用户单击打印链接时:

  • 它在同一选项卡中打开Adobe Reader并加载文件
  • 它会立即显示“打印”对话框
  • 一旦打印对话框关闭(无论点击“确定”还是“取消”),浏览器选项卡将返回到网页
  • 我能够在Ruby中轻松地完成所有这些更改,只需使用文件和IO模块;我打开了使用外部工具生成的PDF,然后将外部参照添加到现有目录部分,然后在PDF上添加一个新部分,其中包含更新的目录对象,其中包含我的特殊OpenAction行以及新的操作对象

    由于PDF的增量修订功能,您无需对现有数据进行任何更改即可完成此操作,只需在末尾附加一节即可。

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


    我使用
    命名操作
    而不是javascript,因为javascript经常被禁用,如果没有禁用,就会发出警告

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

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

    但后来我发现哪个是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
    
    10
    是对象1,版本0,
    9 0
    是对象9,版本0。在pdf预告片中,表示是对象1作为根节点。如您所见,有一个来自对象1的引用,
    /OpenAction
    用于运行对象9修订版0

    使用ghostscript,可以将pdf转换为postscript(pdf2ps),附加上面的文本,然后使用
    ps2pdf
    将其转换回pdf。应该注意的是,有关pdf的元信息在转换过程中丢失。我
    <input type="button" value="Print" onclick="printTrigger('iFramePdf');" />
    
    <iframe id="iFramePdf" src="myPdfUrl.pdf" style="display:none;"></iframe>
    
    %AUTOPRINT
    [ /_objdef {PrintAction} /type /dict /OBJ pdfmark
    [ {PrintAction} << /Type /Action /S /Named /N /Print >> /PUT pdfmark
    [ {Catalog} << /OpenAction {PrintAction} >> /PUT pdfmark
    
    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
    
    <input type="button" value="Print" onclick="document.getElementById('PDFtoPrint').focus(); document.getElementById('PDFtoPrint').contentWindow.print();">