不是单页图片,是多页pdf转成一张图片的逻辑。
我这里的场景是pdf转成图片之后返回给前端,前端再在图片上实现签字,并且可拖拽的逻辑,就是签订合同的场景。
但是这里只写后端多页pdf转图片的逻辑。
先说逻辑,后面直接上代码,大致分为以下几步:
- 读取pdf文件(我的代码里是将在线的url转成inputstream了)
- 按pdf的页面循环计算图片的宽度和高度,其中宽度为pdf最宽的那一页的宽度(毕竟有的pdf比较骚,可能一页是横的,一页是竖的),高度为所有页面加起来的高度
- 用graphics2d绘制
- 将graphics2d的绘制结果输出为图片(只要有outputstream都好说,我这里是输出成base64给前端了,没什么存起来的必要)
好了,直接上代码:
先在pom.xml导入依赖:
<!-- pdf读取 -->
<dependency>
<groupid>org.apache.pdfbox</groupid>
<artifactid>pdfbox</artifactid>
<version>2.0.1</version>
</dependency>
<dependency>
<groupid>org.apache.pdfbox</groupid>
<artifactid>fontbox</artifactid>
<version>2.0.1</version>
</dependency>
public string getsinglepicbase64contracts(string fileurl) throws ioexception {
byte[] pdfbytes = httputil.createget(fileurl).execute().bodybytes();
inputstream inputstream = new bytearrayinputstream(pdfbytes);
pddocument doc = pddocument.load(inputstream);
pdfrenderer pdfrenderer = new pdfrenderer(doc);
list<bufferedimage> imagelist = new arraylist<>(doc.getnumberofpages());
int maxwidth = 0;
int totalheight = 0;
for (int i = 0; i < doc.getnumberofpages(); i++) {
bufferedimage image = pdfrenderer.renderimage(i, 1.25f);
imagelist.add(image);
if (image.getwidth() > maxwidth) {
maxwidth = image.getwidth();
}
totalheight += image.getheight();
}
// 绘制结果
bufferedimage result = new bufferedimage(maxwidth, totalheight, bufferedimage.type_int_rgb);
graphics2d g2d = result.creategraphics();
int nowheight = 0;
for (bufferedimage bufferedimage : imagelist) {
// padding 为页面的左边距
int padding = (maxwidth - bufferedimage.getwidth()) / 2;
g2d.drawimage(bufferedimage, padding, nowheight, null);
nowheight += bufferedimage.getheight();
}
bytearrayoutputstream outputstream = new bytearrayoutputstream();
imageio.write(result, "png", outputstream);
string singlepicbase64 = "data:image/png;base64," + base64.encodebase64string(outputstream.tobytearray());
return singlepicbase64;
}
到此这篇关于springboot实现pdf转图片的代码示例的文章就介绍到这了,更多相关springboot pdf转图片内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论