如何使用 JavaScript 从 Web 服务返回的二进制字符串构建 PDF 文件

2024-03-12

我正在尝试从二进制流中构建一个 PDF 文件,该文件是我收到的 Ajax 请求的响应。

Via XmlHttpRequest我收到以下数据:

%PDF-1.4....
.....
....hole data representing the file
....
%% EOF

到目前为止我尝试的是通过嵌入我的数据data:uri。现在,没有任何问题,并且工作正常。不幸的是,它在 IE9 和 Firefox 中不起作用。可能的原因是 FF 和 IE9 在使用data-uri.

现在,我正在寻找适用于所有浏览器的解决方案。这是我的代码:

// responseText encoding 
pdfText = $.base64.decode($.trim(pdfText));

// Now pdfText contains %PDF-1.4 ...... data...... %%EOF

var winlogicalname = "detailPDF";
var winparams = 'dependent=yes,locationbar=no,scrollbars=yes,menubar=yes,'+
            'resizable,screenX=50,screenY=50,width=850,height=1050';

var htmlText = '<embed width=100% height=100%'
                     + ' type="application/pdf"'
                     + ' src="data:application/pdf,'
                     + escape(pdfText)
                     + '"></embed>'; 

                // Open PDF in new browser window
                var detailWindow = window.open ("", winlogicalname, winparams);
                detailWindow.document.write(htmlText);
                detailWindow.document.close();

正如我所说,它在 Opera 和 Chrome 上运行良好(Safari 尚未经过测试)。使用 IE 或 FF 将打开一个空白的新窗口。

有没有像在文件系统上构建 PDF 文件之类的解决方案 为了让用户下载它?我需要适用于所有浏览器的解决方案,至少适用于 IE、FF、Opera、Chrome 和 Safari。

我无权编辑 Web 服务实现。所以它必须是客户端的解决方案。有任何想法吗?


是否有任何解决方案,例如按顺序在文件系统上构建 pdf 文件 让用户下载它?

尝试设置responseType of XMLHttpRequest to blob, 代入download属性位于a元素为window.open允许下载响应XMLHttpRequest as .pdf file

var request = new XMLHttpRequest();
request.open("GET", "/path/to/pdf", true); 
request.responseType = "blob";
request.onload = function (e) {
    if (this.status === 200) {
        // `blob` response
        console.log(this.response);
        // create `objectURL` of `this.response` : `.pdf` as `Blob`
        var file = window.URL.createObjectURL(this.response);
        var a = document.createElement("a");
        a.href = file;
        a.download = this.response.name || "detailPDF";
        document.body.appendChild(a);
        a.click();
        // remove `a` following `Save As` dialog, 
        // `window` regains `focus`
        window.onfocus = function () {                     
          document.body.removeChild(a)
        }
    };
};
request.send();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 JavaScript 从 Web 服务返回的二进制字符串构建 PDF 文件 的相关文章

随机推荐

  • Objective C - 自清零弱指针意外行为

    我最近从 Mavericks 升级到 Yosemite 现在我的单元测试失败了 问题归结为指向字符串内容的弱指针中的拼写错误 请看下面的示例代码 NSString value1 NSString value2 weak NSString w
  • 如何在 C 或 C++ 中全局初始化数组?

    我正在尝试这样做 for int k 0 k
  • 如何覆盖 ruby​​ on Rails 4.0.+ 中的默认主键列?

    我已经有一个现有的数据库架构 其中的表以字符串列作为主键 还有一些表以多个列作为键 我想在 Rails 中映射此架构 但我不知道如何覆盖默认主键 由 Rails 框架创建的列 id 您可以像这样覆盖主键 class Book lt Acti
  • 计算数据库中截止日期与今天日期匹配的所有记录

    我需要计算数据库中截止日期与今天日期匹配的所有记录 我发现我应该能够使用 COUNT 和 CURDATE 来做到这一点 但我无法做到正确 SELECT COUNT id FROM tasks WHERE due date CURDATE 从
  • 在VIM中,是否可以在替代子句中使用选定的文本而无需重新输入?

    假设我在视觉模式下选择了一个单词 我想使用 s 对该单词以及文件中该单词的所有其他实例执行替换 有没有办法使用突出显示的文本s
  • Windows 中是否有类似 GREP 的模式匹配实用程序?

    有没有类似的实用工具grep可从 Windows 命令提示符获取 或者是否有第三方工具 有一个命令行工具叫做FINDSTR随所有 Windows NT 级操作系统一起提供 类型FINDSTR 进入命令提示符窗口以获取更多信息 它并不支持所有
  • 如何使用 geom_boxplot(stat = "identity") 模拟带有异常值的 geom_boxplot()

    我想预先计算数据的变量摘要 使用plyr并通过一个quantile函数 然后用geom boxplot stat identity 这非常有效 除了它 a 不将异常值绘制为点以及 b 将 胡须 扩展到所绘制数据的最大值和最小值 Exampl
  • Git 分支命名规则[重复]

    这个问题在这里已经有答案了 当我在 Git 中命名分支时 我总是倾向于以字母开头 mybranch89例如 Git 分支的命名有什么规则吗 例如 我应该始终以字母开头 还是只能使用数字分支名称 例如876 规则是相当复杂 http git
  • 在 TextView 中显示图像

    我希望在 TextView 中显示图像 我的图像保存在 res raw 目录中 我尝试使用 HTML ImageGetter 但找不到相同的完整参考 import android app Activity import android gr
  • 追踪事务为何升级为 DTC

    有什么方法可以准确确定 System Transaction TrasactionScope 升级为 DTC 的原因吗 我们的一个组件遇到了麻烦 该组件似乎升级了交易 而所有其他组件 看起来看似相似 却没有升级 是否提供了有关升级原因以及如
  • 如何在Python中查找字符串中的一个数字?

    我有一个名为 FILE 1 txt 或 FILE 340 txt 的文件 我希望能够从文件名中获取数字 我发现我可以使用 numbers re findall r d s filename 获取包含数字的列表 并使用numbers 0 将数
  • 什么时候应该使用 XS?

    我正在写一篇关于 XS 的演讲 我需要知道社区何时认为适合采用 XS 我可以想到至少三个使用 XS 的理由 您有一个想要在 Perl 5 中访问的 C 库 您有一段代码 它确实会减慢您的程序速度 如果用 C 编写 速度会更快 您需要访问仅在
  • 想在Mysql中为两个不同的数据库编写触发器

    有没有办法在Mysql中的两个不同的数据库上创建触发器 我的要求是这样的 database test1 gt table tmp1 database test2 gt table tmp2 现在我必须在 test1 上使用触发器插入操作发生
  • 错误:没有匹配的函数来调用“Point::Point()”

    因此 我创建了 Point 类 并希望将其用作 Circle 类中构造函数的参数 但出现错误 没有显示类 Point 的默认构造函数 我不知道如何修复它 代码如下所示 class Point private int x y public P
  • 使用android的sip进行Android音频通话

    我为客户开发了一个使用 sip 进行互联网呼叫的应用程序 为此 他向我提供了两个有效的 sip 用户 ID 和密码 我正在使用 SIP API 进行 SIP 实施 客户说呼叫无法进行 当他使用自己的帐户登录时 他没有收到任何有关未接来电的通
  • 动态渲染vue模板

    我有 vue 模板数据作为字符串 例如 String s div myData div 现在我想在我已经定义的 vue 组件中进行渲染
  • Laravel 如何测试控制器中的复选框是否被选中

    我试图获取复选框是否已选中 在我看来
  • ASP.NET MVC 项目中的 Web 表单?

    我需要向 ASP NET MVC 项目添加一个 管理 区域 并且我需要它来使用 ASP NET Web 窗体 而不是 MVC ASP NET Web 窗体可以在 ASP NET MVC 应用程序中使用吗 我在 MVC 项目中有类似的东西 因
  • vtable存放在内存的什么位置?

    vtable存放在内存的什么位置 取决于编译器 在 VC 中 vtable 指针存储在对象分配的开始处 位于任何成员数据之前 前提是您的类至少有一个虚拟成员函数 如果您的类从具有虚函数表的其他类进行多重继承 则还可能有多个虚函数表指针 vt
  • 如何使用 JavaScript 从 Web 服务返回的二进制字符串构建 PDF 文件

    我正在尝试从二进制流中构建一个 PDF 文件 该文件是我收到的 Ajax 请求的响应 Via XmlHttpRequest我收到以下数据 PDF 1 4 hole data representing the file EOF 到目前为止我尝