需求:将后台返回的pdf流文件转换成图片与页面其他内容一起打印
pdf流文件不能直接在前台显示,需要借助pdf.js+viewer.js。

一般情况下,如果要打印pdf流文件,可以直接在新打开的viewer.html页面点击打印,但现在想跟页面其他内容一块打印,界面如下图所示,选择打印附件,再点击打印时,需要将pdf文件跟当前页面一起打印出来,当前页面的内容,可以根据html()方法获取,但是pdf内容应该怎么加入到html里呢??

我们可以借助pdf.js,worker.js, 当选择打印附件的时候,调用loadPDF()方法,传入流文件地址,在页面中将pdf转换成canvas,然后将canvas保存成图片,将转换成的img图片地址添加到页面里,这时候点击打印,获取html()就可以将pdf内容一并打印出来了。

function renderPDF(pdf,i,id) {
console.log(pdf);
pdf.getPage(i).then(function(page) {
var scale = 1.5;
var viewport = page.getViewport(scale);
// 准备用于渲染的 canvas 元素
var canvas = document.getElementById(id);
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width; // 将 PDF 页面渲染到 canvas 上下文中
var renderContext = {
canvasContext: context,
viewport: viewport
};
page.render(renderContext);
setTimeout(function(){ //当canvas渲染完成之后,将canvas内容转换成图片,添加到页面上
var img=new Image();
img.src=canvas.toDataURL("image/jpeg");
$("div[name=divImage]").append("<div style=\"page-break-before:always;text-align:left;\">" +
"<p style=\"width:100%;text-align:left;font-size:13px;display:inline\">"+langConfig.finance.applyDetailNum+" :" + $("#container").attr("applyCode") + "</p>" +
"</div>").append(img);
// $("#imgList").append(img);
},1000); }) };
function loadPDF(fileURL) {
pdfjsLib.getDocument(fileURL).then(function(pdf) {
//用 promise 获取页面
var id = '';
var idTemplate = 'cw-pdf-';
var pageNum = pdf.numPages;
//根据页码创建画布
createSeriesCanvas(pageNum,idTemplate);
//将pdf渲染到画布上去
for (var i = 1; i <= pageNum; i++) {
id = idTemplate + i;
renderPDF(pdf,i,id);
}
});
}
//创建和pdf页数等同的canvas数
function createSeriesCanvas(num,template) {
var id = '';
for(var j = 1; j <= num; j++){
id = template + j;
createPdfContainer(id,'pdfClass');
}
}
function createPdfContainer(id,className) {
var pdfContainer = document.getElementById('container');
var canvasNew =document.createElement('canvas');
canvasNew.id = id;
canvasNew.className = className;
pdfContainer.appendChild(canvasNew);
};

缺点:如果pdf页数较多时,canvas转换过程耗时太长,页面会有卡住的情况。
参考链接:https://www.jianshu.com/p/07943cbf2ecf

pdf流文件转图片的更多相关文章

  1. php从数据库中取二进制流文件转换为图片,图片以二进制流存入数据库实现

    php从数据库中取二进制流文件转换为图片,图片以二进制流存入数据库实现 function data_uri($contents, $mime) { $base64 = base64_encode($c ...

  2. pdf流文件的展示、下载、打印;html转为pdf

    背景:合同(后台返回pdf流文件)展示.下载.打印,基于angular4 场景区分: 1.checkout页面 —— post接口,入参为offering.shippingInfo.invoice等( ...

  3. 【使用Itext处理PDF文档(新建PDF文件、修改PDF文件、PDF中插入图片、将PDF文件转换为图片)】

    iText简介 iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转 ...

  4. winform利用itextsharp.dll实现图片文件转换PDF格式文件

    1.利用itextsharp.dll实现单个图片文件转换为PDF格式文件, 可以使用以下类: void ConvertJPG2PDF(string jpgfile, string pdf) { var ...

  5. JavaWeb项目生成PDF文件添加水印图片并导出

    一.前言 首先需要在Maven中添加相应的jar包依赖,若项目没用到Maven,也可自行下载相应所需的jar包(itextpdf.jar 与 itext-asian.jar),如下图所示.点此下载 M ...

  6. 导出文本、表格、图像到PDF格式文件中(学习整理)

    1.测试例子: 需要导入的外部jar包: 相关API http://www.coderanch.com/how-to/javadoc/itext-2.1.7/com/lowagie/text/pack ...

  7. PDF文档转换为图片、图片转成PDF 及PDF合并

    简介 功能:PDF文档按每页转换成一张图片,一张图片转换成一张PDF 并将多张PDF合成一个多页的PDF文档. 经历:在各个网站上搜索始终出现各种问题,尤其是遇到引用的版本问题尤其头疼,不是不能适用当 ...

  8. 纯前端下载pdf链接文件,而不是打开预览的解决方案

    纯前端下载pdf链接文件,而不是打开预览的解决方案 一,介绍与需求 1.1,介绍 XMLHttpRequest 用于在后台与服务器交换数据.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行 ...

  9. C#实现 word、pdf、ppt 转为图片

    office word文档.pdf文档.powerpoint幻灯片是非常常用的文档类型,在现实中经常有需求需要将它们转换成图片 -- 即将word.pdf.ppt文档的每一页转换成一张对应的图片,就像 ...

随机推荐

  1. Java实现第九届蓝桥杯耐摔指数

    耐摔指数 题目描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后 ...

  2. MyBatis整合双数据源

    有时候在项目中会遇到需要连接两个数据库的情况.本文就结合Spring和Mybatis来讲下怎么使用双数据源(或者是多数据源). 背景知识介绍 本文中实现多数据源的关键是Spring提供的Abstrac ...

  3. http1.0 、http1.1和http2.0的区别

    一.HTTP1.0 HTTP 1.1主要区别       1.1 长链接             HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支 ...

  4. Java设计模式之亨元模式

    之前在项目中接触过亨元模式这一种设计模式,当时因为项目赶进度,因此只不过是大概的了解了一下,刚好今天有时间,就写一篇博客详细的学习一下亨元模式. 一.概念 运用共享技术有效的支持大量细粒度的对象.(来 ...

  5. AndroidCamera开发学习笔记01

    概述 Android框架支持设备的相机拍照和录像功能 可以直接调用系统的Camera应用来拍照或录像 也可以利用Adroid系统提供的API开发Camera应用来实现拍照和录像的功能 注意事项 需要硬 ...

  6. Linux系统如何设置开机自动运行脚本?

    大家好,我是良许. 在工作中,我们经常有个需求,那就是在系统启动之后,自动启动某个脚本或服务.在 Windows 下,我们有很多方法可以设置开机启动,但在 Linux 系统下我们需要如何操作呢? Li ...

  7. 大话微服务(Big Talk in MicroService)

    下面开始分析我的microservice 之旅. what? 是什么 why? 为什么 how? 什么做 1.什么是微服务 microservice 是 SOA(Service-Oriented Ar ...

  8. @bzoj - 3711@ [PA2014]Druzyny

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 体育课上,n个小朋友排成一行(从1到n编号),老师想把他们分成若 ...

  9. (七)logback 异步输出日志

    <!-- 异步输出 --> <appender name="ASYNC-INFO" class="ch.qos.logback.classic.Asyn ...

  10. 如何从二进制文件中读取int型序列

    使用的主要函数是int.from_bytes 代码如下: f = open('./T26.dat', 'rb') for i in range(20): A = f.read(2) A = int.f ...