北京建设网站专家,怎么开网店?,电子相册免费制作,黄山旅游攻略及费用不是单页图片#xff0c;是多页PDF转成一张图片的逻辑。
我这里的场景是PDF转成图片之后返回给前端#xff0c;前端再在图片上实现签字#xff0c;并且可拖拽的逻辑#xff0c;就是签订合同的场景。
但是这里只写后端多页PDF转图片的逻辑。
先说逻辑#xff0c;后面直接…不是单页图片是多页PDF转成一张图片的逻辑。
我这里的场景是PDF转成图片之后返回给前端前端再在图片上实现签字并且可拖拽的逻辑就是签订合同的场景。
但是这里只写后端多页PDF转图片的逻辑。
先说逻辑后面直接上代码大致分为以下几步
读取PDF文件我的代码里是将在线的URL转成InputStream了按PDF的页面循环计算图片的宽度和高度其中宽度为PDF最宽的那一页的宽度毕竟有的PDF比较骚可能一页是横的一页是竖的高度为所有页面加起来的高度用Graphics2D绘制将Graphics2D的绘制结果输出为图片只要有outputStream都好说我这里是输出成base64给前端了没什么存起来的必要
好了直接上代码
先在pom.xml导入依赖 !-- pdf读取 --dependencygroupIdorg.apache.pdfbox/groupIdartifactIdpdfbox/artifactIdversion2.0.1/version/dependencydependencygroupIdorg.apache.pdfbox/groupIdartifactIdfontbox/artifactIdversion2.0.1/version/dependencypublic 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);ListBufferedImage 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;}