关于这个话题在社区没有端到端的答案,所以这里是我试图在这里写点东西。 (也许它会帮助其他人)
好的,PDF.js是在浏览器中显示PDF的一种方式,特别是当您不想依赖PDF插件进行安装时。就我而言,我的应用程序生成PDF格式的报告,并且可以在下载之前查看,但在手持设备上,由于缺少PDF阅读器插件,它无法正常工作。
在我的情况下PDF已发送到浏览base64字符串,我可以用它来显示PDF <object src="base64-data"...></object>
。这在Chrome/FF上很有用,但切换到移动视图并停止工作。
<object type="application/pdf" id="pdfbin" width="100%" height="100%" title="Report.pdf">
<p class="text-center">Looks like there is no PDF viewer plugin installed, try one of the below approach...</p>
</object>
在上面的代码中,它会尝试显示PDF或回退到<p>
并显示错误消息。我打算在这一点上添加PDF查看器,PDF.js是选择,但无法显示它。使用Base64数据的PDF.js上的一个示例显示了如何执行此操作,但将其呈现为图像而非PDF,并且我无法找到解决方案,因此问题所在,这是我所做的,
首先添加JavaScript代码为base64转换为数组
转换成团块,并使用viewer.html
文件,PDF.js打包,以显示为PDF
在情况下,如果你想知道为什么的base64数据,那么答案是si mple我可以创建PDF,阅读它,将数据发送到客户端,并删除该文件,我没有运行任何清洁服务/ cron作业删除生成的PDF文件
几件事情要注意
- 下面的代码是用瓶+ Jinja2的,改变的base64方式读取HTML,如果你使用的是别的东西
- 观众。HTML需要改变已要求JS & css文件在正确的位置(默认情况下,他们的位置是相对的,你需要他们从静态文件夹简称)
viewer.js
在预定位置查找pdf.worker.js
,改变的情况下,它的投掷错误如上文件找不到。
viewer.js
威力投file origin does not match viewer
错误在这种情况下作为权宜之计评论会抛出这个错误,看看是否能解决这个问题(寻找在viewer.js的错误)
- 我不是笔者的代码下面的代码,我刚刚从不同的地方放在一起。
我们的代码(以便PDF将被显示时,按钮用户点击与id="open_id"
)
Jquery的
var pdfDataX = '{{ base64Pdf }}';
var BASE64_MARKER = ';base64,';
PDFJS.workerSrc = "{{ url_for('static', filename='js/pdf.worker.js') }}";
$('#open_id').click(function() {
PDFJS.disableWorker = true;
var pdfAsDataUri = "data:application/pdf;base64," + pdfDataX ;
PDFJS.workerSrc = "{{ url_for('static', filename='js/pdf.worker.js') }}";
// Try to show in the viewer.html
var blob = base64toBlob(pdfDataX, 'application/pdf');
var url = URL.createObjectURL(blob);
var viewerUrl = "{{ url_for('static', filename='viewer.html') }}" + '?file=' + encodeURIComponent(url);
$('#pdfViewer').attr('src', viewerUrl);
// Finish
var mdObj = $('#pdfbin');
mdObj.hide();
mdObj.attr('data', pdfAsDataUri);
mdObj.show();
$('#myModal').modal();
});
var base64toBlob = function(b64Data, contentType, sliceSize) {
contentType = contentType || '';
sliceSize = sliceSize || 512;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {
var slice = byteCharacters.slice(offset, offset + sliceSize);
var byteNumbers = new Array(slice.length);
for (var i=0; i<slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
var blob = new Blob(byteArrays, {type: contentType});
return blob;
}
$('.save').click(function(e) {
e.preventDefault();
var blob = base64toBlob(pdfDataX, 'application/pdf');
saveAs(blob, 'abcd.pdf'); // requires https://github.com/eligrey/FileSaver.js/
return false;
});
HTML
<object type="application/pdf" id="pdfbin" width="100%" height="100%" title="Resume.pdf">
<p class="text-center">Looks like there is no PDF viewer plugin installed, try one of the below approach...</p>
<iframe id="pdfViewer" style="width: 100%; height: 100%;" allowfullscreen="" webkitallowfullscreen=""></iframe>
</object>
希望这将是对别人有用的未来。
不知道为什么这个答案收到-2声望,至少让我知道你为什么要标记它 - 为什么? –