需求:将后台返回的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. Spring Data Jpa Specification 调用Oracle 函数/方法

    开发框架用的Jpa,数据库是 Oracle. 在开发中难免会遇到需要数据库字段是字符串格式,但是又需要对其进行范围查询(数据库设计问题,后续应避免).那么问题来了, Jpa Specification ...

  2. 使用WPF实现的 喜马拉雅FM 资源下载工具

    因为喜马拉雅pc网站上没有提供下载功能,之前有个同事问我有没有办法将资源下载到本地,当然通过浏览器F12也能找到下载地址,但挺麻烦.正好最近想学wpf,周末在家也没事,于是对着百度撸了下代码.当然只能 ...

  3. 双向链表都不懂,还说懂Redis?

    目录 redis源码分析系列文章 前言 API使用 lpush左侧插入数据 rpush右侧插入数据 删除某个数据 修改某个数据 具体逻辑图 双向链表的定义 节点ListNode 整体架构 双向链表的实 ...

  4. VMWare的三种网络连接方式

    VMWare和主机的三种网络连接方式 桥接 这种模式下,虚拟机通过主机的网卡与主机通信,如果主机能够上网,则虚拟机也能联网. 在虚拟机中,需要将虚拟机的IP配置为与主机处于同一网段. 虚拟机也可以与同 ...

  5. 私有云nextcloud、seafile、syncthing的比较

    可选 nextcloud.seafile.syncthing 1. seafile https://www.jianshu.com/p/43f570118e63 https://www.jianshu ...

  6. Python 图像处理 OpenCV (10):图像处理形态学之顶帽运算与黑帽运算

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  7. (五)POI-设置单元格的对齐方式

    原文链接:https://blog.csdn.net/class157/article/details/92817149 package com.java.poi; import org.apache ...

  8. 3 年经验的 Java 后端妹子,横扫阿里、滴滴、美团,整理出这份厚厚的 8000 字面经!

    自序 这次面试的公司有一点点多,主要是因为毕业后前两份工作找的都很草率,这次换工作就想着,emm,毕业三年了,该找个工作好好沉淀几年了. 先说下这次面试的结果吧: 到 hr 面的:阿里.美团.滴滴.金 ...

  9. Android学习笔记Intent二

    上篇随笔大概写了了Intent学习的大纲,这篇通过代码理解下Intent的ComponentName属性的使用 ComponentName,中文意思是组件名称,通过Intent的setsetCompo ...

  10. 涨姿势了解一下Kafka消费位移可好?

    摘要:Kafka中的位移是个极其重要的概念,因为数据一致性.准确性是一个很重要的语义,我们都不希望消息重复消费或者丢失.而位移就是控制消费进度的大佬.本文就详细聊聊kafka消费位移的那些事,包括: ...