业务场景:对方接口直接返回base64 pdf ,使用ie10的浏览器
直接放入ifram 标签 或者enbed 出现问题,ifram会出现ie bug在火狐、谷歌中图片显示正常,enbed 标签和ifram 标签的在赋值后加载我也有问题,打印我是直接延续使用原来项目中使用的Lodop.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<embed id="base64Img" src="data:application/pdf;base64,base64串" alt="获取人员信息失败"/>
</body>
</html>
如上ie就会出现空白问题;
因为后续看见pdfjs 也使用了ifram标签,但是是引入地址的方式,某其他公司盆友说ie还是没有显示出来,于是没有尝试了。
后端转换长图片代码
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
@Slf4j
public class PdfConvertImg {
static BASE64Decoder decoder = new sun.misc.BASE64Decoder();
public static String base64pdf2Image(String base64Pdf) {
String jpg_base64 = null;
try {
// Base64解码
byte[] pdf_bytes = decoder.decodeBuffer(base64Pdf);
PDDocument doc = PDDocument.load(pdf_bytes);
int size = doc.getNumberOfPages();
/*图像合并使用的参数*/
//定义宽度
int width = 0;
// 保存一张图片中的RGB数据
int[] singleImgRGB;
// 定义高度,后面用于叠加
int shiftHeight = 0;
//保存每张图片的像素值
BufferedImage imageResult = null;
// 利用PdfBox生成图像
PDDocument pdDocument = doc;
PDFRenderer renderer = new PDFRenderer(pdDocument);
/*根据总页数, 按照50页生成一张长图片的逻辑, 进行拆分*/
// 每50页转成1张图片
int pageLength = size; //有多少转多少
// 总计循环的次数
int totalCount = pdDocument.getNumberOfPages() / pageLength + 1;
for (int m = 0; m < totalCount; m++) {
for (int i = 0; i < pageLength; i++) {
int pageIndex = i + (m * pageLength);
if (pageIndex == pdDocument.getNumberOfPages()) {
System.out.println("循环次数 m = " + m);
break;
}
// dpi为图片的dpi,dpi越大,则图片越清晰,图片越大,转换耗费的时间也越多
BufferedImage image = renderer.renderImageWithDPI(pageIndex, 86, ImageType.RGB);
int imageHeight = image.getHeight();
int imageWidth = image.getWidth();
if (i == 0) {
//计算高度和偏移量
//使用第一张图片宽度;
width = imageWidth;
// 保存每页图片的像素值
// 加个判断:如果m次循环后所剩的图片总数小于pageLength,则图片高度按剩余的张数绘制,否则会出现长图片下面全是黑色的情况
if ((pdDocument.getNumberOfPages() - m * pageLength) < pageLength) {
imageResult = new BufferedImage(width, imageHeight * (pdDocument.getNumberOfPages() - m * pageLength), BufferedImage.TYPE_INT_RGB);
} else {
imageResult = new BufferedImage(width, imageHeight * pageLength, BufferedImage.TYPE_INT_RGB);
}
} else {
// 将高度不断累加
shiftHeight += imageHeight;
}
singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
}
// 这个很重要,下面会有说明
shiftHeight = 0;
}
pdDocument.close();
ByteArrayOutputStream baos;//io流
baos = new ByteArrayOutputStream();
ImageIO.write(imageResult, "jpg", baos);//写入流中
byte[] jpg_Bytes = baos.toByteArray();//转换成字节
BASE64Encoder encoder = new BASE64Encoder();
jpg_base64 = encoder.encodeBuffer(jpg_Bytes).trim();//转换成base64串
jpg_base64 = jpg_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
baos.close();
doc.close();
} catch (IOException e) {
e.printStackTrace();
}
return jpg_base64;
}
}
后端th:页面
赋值
<input style="display:none;" id="base64Str" th:value="${BaseStr}"/>
打印
<button class="layui-btn layui-btn-big" onclick="printPage();">
打印
</button>
js
function printPage(){
$('.layui-btn').hide();
var LODOP=getLodop();
LODOP.PRINT_INIT('');
//LODOP.SET_PRINT_PAGESIZE(1, 0, 0,"A4");
/* pcs.each(function () {
LODOP.ADD_PRINT_HTM(0,0,"RightMargin:5px","100%",$(this).html());
LODOP.NewPage();
}); */
LODOP.ADD_PRINT_HTML(0,0, "100%","100%","<!DOCTYPE html>"+document.getElementsByTagName("html")[0].innerHTML);
var result = LODOP.PRINT();
if(result){
$.post('/apis/v1/insurance/other-print',{ywlx:'3'});
layer.msg('打印成功,请取走您的打印单据.',{time:-1});
}else{
layer.msg('打印异常,请联系管理员.',{time:-1});
}
}
使用lodop
js文件下载地址
https://pan.baidu.com/s/1TqBKlmvd-kIO_4Z-HBJUAg
具体细节进入官网: http://www.lodop.net/download.html
pdfbox中文乱码问题:
https://www.pianshen.com/article/8207279287/