无需打开即可打印 PDF

2024-06-25

我想要构建的是,通过单击按钮,我想触发 PDF 文件的打印,但不打开它。

+-----------+
| Print PDF |
+-----------+
     ^ Click *---------> printPdf(pdfUrl)

我第一次尝试的方法是使用 iframe:

var $iframe = null;

// This is supposed to fix the onload bug on IE, but it's not fired
window.printIframeOnLoad = function() {
  if (!$iframe.attr("src")) { return; }
  var PDF = $iframe.get(0);
  PDF.focus();

  try {
    // This doesn't work on IE anyways
    PDF.contentWindow.print();

    // I think on IE we can do something like this:
    // PDF.document.execCommand("print", false, null);
  } catch (e) {
    // If we can't print it, we just open it in the current window
    window.location = url;
  }
};

function printPdf(url) {

  if ($iframe) {
    $iframe.remove();
  }

  $iframe = $('<iframe>', {
    class: "hide",
    id: "idPdf",
    // Supposed to be a fix for IE
    onload: "window.printIframeOnLoad()",
    src: url
  });

  $("body").prepend($iframe);
}

这适用于 Safari(桌面和 iOS)和 Chrome(我们可以将其推广到 webkit 吗?)。

在火狐浏览器上,PDF.contentWindow.print()以一个结尾permission denied错误(即使pdf是从同一个域加载的)。

在 IE (11) 上,onload处理程序只是不工作。


现在,我的问题是:是否有另一种更好的方法来打印 pdf 而无需向用户直观地打开它?

跨浏览器的事情在这里至关重要。我们应该支持尽可能多的浏览器。

实现这一目标的最佳方法是什么?我的开始是好的吗?如何完成呢?

We are now in 2016 and I feel like this is still a pain to implement across the browsers.


UPDATE: This link http://nvision.co/blog/tips-and-tricks/auto-print-pdf-file-open/详细介绍了一个优雅的解决方案,其中涉及编辑第一页的页面属性并在页面打开上添加操作。适用于所有浏览器(因为浏览器将执行放置在操作部分中的 JavaScript)。需要 Adob​​e Acrobat Pro。


2016 年似乎没有给打印问题带来新的进展。有类似的问题,为了使打印跨浏览器,我使用解决了它PDF.JS https://mozilla.github.io/pdf.js/但必须对源代码进行简短的补充(他们要求您以任何方式在其基础上进行构建)。

想法:

  • 从以下位置下载预构建的稳定版本https://mozilla.github.io/pdf.js/getting_started/#download https://mozilla.github.io/pdf.js/getting_started/#download并将“build”和“web”文件夹添加到项目中。
  • The viewer.html文件是通过丰富的界面呈现 PDF 并包含打印功能的。我在该文件中添加了一个指向我自己的 JavaScript 的链接,该链接在延迟后简单地触发 window.print() 。

添加到查看器的链接:

    <script src="viewer.js"></script>
    <!-- this autoPrint.js was added below viewer.js -->
    <script src="autoPrint.js"></script>
</head>

The autoPrint.jsjavascript:

(function () {
    function printWhenReady() {
        if (PDFViewerApplication.initialized) {
            window.print();
        }
        else {
            window.setTimeout(printWhenReady, 3000);
        }
    };

    printWhenReady();
})();
  • 然后我可以打电话给viewer.html?file=在 iframe 的 src 中并将其隐藏。由于 Firefox,必须使用可见性,而不是显示样式:

    <iframe src="web/viewer.html?file=abcde.pdf" style="visibility: hidden">
    

结果:打印对话框在短暂延迟后显示,而 PDF 对用户隐藏。

在 Chrome、IE、Firefox 中测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无需打开即可打印 PDF 的相关文章

  • 在 Javascript 中隐藏按钮

    在我最新的程序中 有一个按钮 单击时会显示一些输入弹出框 这些框消失后 如何隐藏按钮 You can set its visibility财产 http www w3schools com cssref pr class visibilit
  • 通过标记或JS强制下载

    假设我在 CDN 来自 Rackspace 的云文件 上有一个文件 以及一个包含该文件链接的静态 html 页面 有什么方法可以强制下载此文件 以防止它在浏览器中打开 例如 mp3 我们可以让我们的服务器读取该文件并将相应的标头设置为 he
  • `forEach` 函数中的 `return` 关键字是什么意思? [复制]

    这个问题在这里已经有答案了 button click function 1 2 3 4 5 forEach function n if n 3 it should break out here and doesn t alert anyth
  • Javascript CORS 图像/画布操作

    我正在尝试从另一个已配置为允许 CORS 的域检索图像 并操纵像素 然后我想显示结果并能够操纵结果 我可以在我请求的图像上使用 getImageData 和 toDataURL 所以我知道服务器部分可以工作 但是 当我尝试将图像的 src
  • 设置三个输入数字的最大值

    我有三个输入数字
  • Angular 4 - 具有动态参数值的自定义验证器

    我编写了一个自定义验证器 用于检查日期是否高于某个最小日期 代码如下所示 export function validateMinDate min Date ValidatorFn return c AbstractControl gt if
  • 发送带有图像的嵌套 JSON

    我一直在尝试研究一种能够通过 Ajax 将嵌套 JSON 请求发送回服务器的方法 根据我的理解 我们主要用于向服务器发送图像或文件的 formdata 在这种情况下不起作用 因为 FormData 似乎不处理嵌套对象 这就是我需要发送的有效
  • jquery 按钮点击背景颜色变化

    为什么这不起作用 jquery button click function go css background color yellow html table tr td hello td table gt tr table
  • a:not(a:not([href])) 选择器

    我希望无论何时 某个操作都与锚标记的点击事件相关联href属性 不开始于mailto and 不以 and 存在任何值 包括空 所以我正在尝试这段代码 a href example com example com a a href Some
  • 将“http://”添加到尚未包含“http://”的 URL 前面

    我有一个input保存 URL 的字段 我希望这个保存的输入能够识别变量开头不存在 Http 但不知道从哪里开始 是否可以仅检查字符串的一部分 然后有一个在必要时追加的函数 如果您还想允许 https 我会使用如下正则表达式 if http
  • javascript 中的工厂模式与构造函数模式[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我看到了关于 javascript 设计模式的教程 虽然教程很好 但它给我留下了很少的问题 正如我所见 工厂和构造函数产生相同的结果
  • 为什么我的数据没有存储到我的 Firebase 实时数据库中?

    我正在尝试为网络应用程序制作一个注册页面 这会将数据发送到 firebase 数据库 我已阅读官方 firebase 文档并按照说明写入数据 但什么也不会写 在我的数据库控制台中 它显示的所有内容都是空 而不是我的数据 我没有收到控制台错误
  • HTML 画布从 getImageData 返回“偏离一些”字节

    我找到getImageDataHTML 画布似乎返回不正确的字节值 我使用以下 Python 代码生成了 1x1 px 图像 from PIL import Image import numpy as np a np array 12 18
  • React cloneElement 未设置键

    我正在构建一个动态生成键的表控件 我理解这可能不是一个好主意 我想键应该与其代表的数据唯一关联 否则 React 只能为我们生成唯一的 id 但无论哪种方式似乎没有设置按键 我不知道为什么 表中的行是用可以找到的函数生成的here http
  • Javascript - HTML Canvas 上的 Gecko 边框半径自适应(CSS border-radius)

    我试图弄清楚如何将 border radius css 属性的行为重现到 HTML 画布中 所以我已经在 J avascript 中做了一些事情 以便使用特定的半径 对于每个角 来计算给定形状的正确边界 如果需要的话 这是上一个问题 Gec
  • Javascript - 通过键获取特定 JSON 数组元素内的属性值

    我有一个像这样的 JSON 结构 map key1 valueA1 key2 valueA2 key3 valueA3 key1 valueB1 key2 valueB2 key3 valueB3 key1 valueC1 key2 val
  • 多个引导模式的滚动问题

    我有一个带有大量信息的模态页面 因此您需要滚动 该模式包含指向第二个模式的链接 When I 打开模态 1 单击链接打开模式 2 模式 1 保持在后台 然后关闭模式 2 以便我回到模式 1 modal 1 失去滚动 仍然有一个滚动条 但它不
  • 如何防止 Bootstrap Navbar Toggle 下推内容?

    我将 Bootstrap 与静态顶部导航栏一起使用 如下所示
  • 在用户单击之前图像不会绘制在画布上?

    我使用执行类似以下操作的函数绘制几张图像 context drawImage img width 2 1 height 2 1 width height 我读过 我需要等待图像加载后才能绘制它 如下所示 img onload functio
  • 如何将国家/地区代码与电话号码分开?

    我的数据库中有很多电话号码 例如 1 123 456 7890 我要做的是将国家 地区拨号代码 在本例中为美国 加拿大的 1 与电话号码分开 我尝试创建所有国家 地区的 JSON 列表 并在加载页面时将电话号码和国家 地区代码分开 它工作正

随机推荐

  • gai_cancel() 需要很长时间才能成功

    我正在尝试在 C 中异步查找域 原因是我希望能够有效地添加超时期限 以防系统无法查找域 我遇到了 getaddrinfo a 命令 所以我决定尝试一下 然而 在我的机器上取消任何不会成功的 dns 查找 例如没有互联网连接时 永远不会花费少
  • 如果不在异步测试执行区域内,fixture.whenStable() 实际上会在我的角度测试中执行任何操作吗?

    我最近读了很多关于角度测试的文章 这些对总是 async fixture whenStable 和 fakeAsync tick 但是您始终可以调用 fixtrue whenStable 因为它不是紧密耦合的 如果您在不使用异步实用程序来跟
  • Ansible 从列表中使用存档模块创建 tar.gz

    我试图在 Ansible 中查找超过一天的文件 然后创建这些文件的 tar gz 我已经尝试过archive模块 尽管它只创建列表中最后一个元素的 tar 有什么方法可以创建包含所有文件的 tar gz 吗 下面是我的脚本 name Che
  • Meteor的源代码向客户开放吗?

    从总体上看 由于 编写一个 Javascript 文件 同时在客户端和服务器上运行它 主题 Meteor 应用程序的源代码似乎对客户端开放 如果特定应用程序的服务器端源代码向客户端开放 那么随机的人是否很容易复制它们并创建非常相似的应用程序
  • python中ffmpeg的管道输入和输出

    我在用着ffmpeg从我通过管道传输的 Base64 编码图像列表创建视频ffmpeg 输出到文件 使用下面附加的代码 工作得很好 但我想要实现的是将输出改为Python变量 意味着管道输入和管道输出 但我似乎无法让它工作 我当前的代码 o
  • 将 MasterPage ImageButton 事件传递给内容页面

    我在 MasterPage 中有 ImageButton 我希望触发 OnClick 事件并由 MasterPage 内托管的 ASPX 页面捕获 母版页
  • Visual Studio 2010 在编辑器中按字母顺序对函数进行排序

    有谁知道如何在编辑器 c 中按字母顺序对类的函数进行排序 IE public class Foo public void B public void D public void A 排序后 类应该看起来像 public class Foo
  • 张量流范围名称有哪些限制?

    我正在运行张量流模型并收到以下错误 ValueError Cement component 1 kg in a m 3 mixture is not a valid scope name 我知道张量流可能不喜欢其范围名称中的特殊字符和空格
  • 如何使用Windows任务计划程序执行cscript?

    问题 当我双击 bat 文件时 它会按预期执行 当我在 Windows 任务计划程序中安排它时 除了具有 cscript 的行之外 它都会执行 bat文件的内容 echo off cls cscript CSV To Excel vbs c
  • 如何使用 ASP.NET 5 (MVC 6) 中的 Response 属性对控制器操作进行单元测试? [复制]

    这个问题在这里已经有答案了 In an ASP NET 核心 1 0 MVC 6 项目我有一个控制器操作方法 我在其中使用Response设置标题的属性 HttpGet public IActionResult Get Response H
  • 简单的 Python 和 Ajax 示例 如何使用 Python 发送响应?

    我正在使用 Python 和 Javascript 测试一些代码 尝试设置 Ajax 系统 基本上我只想输入一个单词并让 python 代码将其发送回来 这是我的 html javascript
  • 如何在循环中添加 Thymeleaf 变量的值并在完成循环后显示最终值

    我正在设计产品账单 我想使用表格在 thymeleaf 模板中显示所有产品 最后 在循环外我想显示 thymeleaf 中所有产品的价格总和 我如何定义全局变量并执行它 table tr td td td td td Paid td td
  • NodeJS MySQL - 如何知道连接是否释放

    我正在开发 NodeJS MySQL Web API 我在用mysql https www npmjs com package mysqlnpm 模块 我想知道连接是否已释放 是否有任何函数或变量 喜欢 if connection isRe
  • 在 Three.js 中设置 2D 视图

    我是新来的three js我正在尝试使用这些 3D 工具建立 2D 可视化 针对各种分层精灵 我想要一些指导PerspectiveCamera 论据和camera position set 论据 我已经朝着正确的方向轻推了这个答案 http
  • C - printf("\a") 不会发出警报[重复]

    这个问题在这里已经有答案了 这是我的 C 代码 include
  • 在 C++ 中按大小零分配内存?

    int a 10 int p new int 0 p a cout lt lt p lt lt endl 在C 中 如果分配内存大小为零会发生什么 分配后 我得到有效的内存指针 并打印有效的数字 但我认为 new 运算符应该返回类似 FAI
  • 如何限制 SQLite / MySQL 中的列值

    我想限制表中的列值 例如 列值只能是car or bike or van 我的问题是如何在 SQL 中实现这一点 在数据库端执行此操作是一个好主意还是应该让应用程序限制输入 我还打算在将来添加或删除更多值 例如 truck 我使用的数据库类
  • Mac 上的 FFMPEG 和 PHP 不起作用

    我需要你的帮助 目前我使用 Mac OS X 10 9 4 和 xampp apache 1 8 3 3 我需要使用ffmpeg 版本3 2 通过php转换视频文件exec 但我无法让它发挥作用 我做了一些运行终端命令行的测试 系统运行正常
  • ASP.NET MVC 3 中未经身份验证用户的缓存主页

    我的网站有一个主页 我想为匿名用户缓存该页面 并将其设置为经过身份验证的用户的 私有 以便他们将其保存在自己的计算机上 而不是其他地方 因此 如果用户是匿名的 我想将页面保存在服务器缓存中 并使用以下命令保存在浏览器缓存中Cache con
  • 无需打开即可打印 PDF

    我想要构建的是 通过单击按钮 我想触发 PDF 文件的打印 但不打开它 Print PDF Click gt printPdf pdfUrl 我第一次尝试的方法是使用 iframe var iframe null This is suppo