一、pom依赖
<!-- pdf插件 start -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.3</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>
<!-- pdf插件 end --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>
二、代码
import cn.hutool.core.io.FileUtil;
import com.itextpdf.text.Document;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import lombok.SneakyThrows;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.DatatypeConverter;
import java.io.*;@RestController
@RequestMapping("/test")
public class TestController {private static final double TOP = 3.7;private static final double BOTTOM = 3.5;private static final double LEFT = 2.8;private static final double RIGHT = 2.6;private static final double CM_2_POUND = 28.35;@GetMapping("/base642pdf")public void base642pdf(HttpServletResponse response) {String base64 = "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";String fileName = "中国城市-导图版";float marginLeft = Math.round(LEFT * CM_2_POUND);float marginRight = Math.round(RIGHT * CM_2_POUND);float marginTop = Math.round(TOP * CM_2_POUND);float marginBottom = Math.round(BOTTOM * CM_2_POUND);Document document = null;OutputStream os = null;try {os = response.getOutputStream();response.setContentType("application/force-download");try {fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");} catch (UnsupportedEncodingException e) {e.printStackTrace();}response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".pdf");document = new Document(PageSize.A4, marginLeft, marginRight, marginTop, marginBottom);document.addTitle(fileName);byte[] bytes = DatatypeConverter.parseBase64Binary(base64);Image img = Image.getInstance(bytes);img.setAlignment(Image.MIDDLE);float contentWidth = PageSize.A4.getWidth() - marginLeft - marginRight;float contentHeight = PageSize.A4.getHeight() - marginTop - marginBottom;float imgWidth = img.getWidth();float imgHeight = img.getHeight();float widthPercent = contentWidth / imgWidth * 100;float heightPercent = contentHeight / imgHeight * 100;img.scalePercent(widthPercent < heightPercent ? widthPercent : heightPercent);PdfWriter.getInstance(document, os);document.open();document.newPage();document.add(img);} catch (Exception e) {e.printStackTrace();} finally {if (document != null) {document.close();}if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}@SneakyThrows@GetMapping("/file2pdf")public void file2pdf(HttpServletResponse response) {File file = ResourceUtils.getFile("classpath:中国城市-导图版.jpg");String fileName = "中国城市-导图版";float marginLeft = Math.round(LEFT * CM_2_POUND);float marginRight = Math.round(RIGHT * CM_2_POUND);float marginTop = Math.round(TOP * CM_2_POUND);float marginBottom = Math.round(BOTTOM * CM_2_POUND);Document document = null;OutputStream os = null;try {os = response.getOutputStream();response.setContentType("application/force-download");try {fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");} catch (UnsupportedEncodingException e) {e.printStackTrace();}response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".pdf");document = new Document(PageSize.A4, marginLeft, marginRight, marginTop, marginBottom);document.addTitle(fileName);byte[] bytes = FileUtil.readBytes(file);Image img = Image.getInstance(bytes);img.setAlignment(Image.MIDDLE);float contentWidth = PageSize.A4.getWidth() - marginLeft - marginRight;float contentHeight = PageSize.A4.getHeight() - marginTop - marginBottom;float imgWidth = img.getWidth();float imgHeight = img.getHeight();float widthPercent = contentWidth / imgWidth * 100;float heightPercent = contentHeight / imgHeight * 100;img.scalePercent(widthPercent < heightPercent ? widthPercent : heightPercent);PdfWriter.getInstance(document, os);document.open();document.newPage();document.add(img);} catch (Exception e) {e.printStackTrace();} finally {if (document != null) {document.close();}if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}@GetMapping("/stream2pdf")public void stream2pdf(HttpServletResponse response) throws FileNotFoundException {File file = ResourceUtils.getFile("classpath:中国城市-导图版.jpg");String fileName = "中国城市-导图版";float marginLeft = Math.round(LEFT * CM_2_POUND);float marginRight = Math.round(RIGHT * CM_2_POUND);float marginTop = Math.round(TOP * CM_2_POUND);float marginBottom = Math.round(BOTTOM * CM_2_POUND);Document document = null;OutputStream os = null;try (InputStream inputStream = new FileInputStream(file)) {os = response.getOutputStream();response.setContentType("application/force-download");try {fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");} catch (UnsupportedEncodingException e) {e.printStackTrace();}response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".pdf");document = new Document(PageSize.A4, marginLeft, marginRight, marginTop, marginBottom);document.addTitle(fileName);byte[] bytes = toByteArray(inputStream);Image img = Image.getInstance(bytes);img.setAlignment(Image.MIDDLE);float contentWidth = PageSize.A4.getWidth() - marginLeft - marginRight;float contentHeight = PageSize.A4.getHeight() - marginTop - marginBottom;float imgWidth = img.getWidth();float imgHeight = img.getHeight();float widthPercent = contentWidth / imgWidth * 100;float heightPercent = contentHeight / imgHeight * 100;img.scalePercent(widthPercent < heightPercent ? widthPercent : heightPercent);PdfWriter.getInstance(document, os);document.open();document.newPage();document.add(img);} catch (Exception e) {e.printStackTrace();} finally {if (document != null) {document.close();}if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}}@GetMapping("/img2LocalPdf")public String img2LocalPdf() throws FileNotFoundException {File file = ResourceUtils.getFile("classpath:中国城市-导图版.jpg");String fileName = "中国城市-导图版";float marginLeft = Math.round(LEFT * CM_2_POUND);float marginRight = Math.round(RIGHT * CM_2_POUND);float marginTop = Math.round(TOP * CM_2_POUND);float marginBottom = Math.round(BOTTOM * CM_2_POUND);File pdf = FileUtil.createTempFile(".pdf", true);Document document = null;OutputStream os = null;try (InputStream inputStream = new FileInputStream(file)) {os = new FileOutputStream(pdf);document = new Document(PageSize.A4, marginLeft, marginRight, marginTop, marginBottom);document.addTitle(fileName);byte[] bytes = toByteArray(inputStream);Image img = Image.getInstance(bytes);img.setAlignment(Image.MIDDLE);float contentWidth = PageSize.A4.getWidth() - marginLeft - marginRight;float contentHeight = PageSize.A4.getHeight() - marginTop - marginBottom;float imgWidth = img.getWidth();float imgHeight = img.getHeight();float widthPercent = contentWidth / imgWidth * 100;float heightPercent = contentHeight / imgHeight * 100;img.scalePercent(widthPercent < heightPercent ? widthPercent : heightPercent);PdfWriter.getInstance(document, os);document.open();document.newPage();document.add(img);} catch (Exception e) {e.printStackTrace();} finally {if (document != null) {document.close();}if (os != null) {try {os.close();} catch (IOException e) {e.printStackTrace();}}}return pdf.getAbsolutePath();}private static byte[] toByteArray(InputStream input) throws IOException {ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[1024 * 4];int n = 0;while (-1 != (n = input.read(buffer))) {output.write(buffer, 0, n);}return output.toByteArray();}
}
三、测试链接
测试下载链接:
1、将base64编码图片字符串转换为pdf,然后在浏览器中下载
链接:http://127.0.0.1:8080/test/base642pdf2、将图片文件转换为pdf,然后在浏览器中下载
链接:http://127.0.0.1:8080/test/file2pdf3、将图片输入流转换为pdf,然后在浏览器中下载
链接:http://127.0.0.1:8080/test/stream2pdf4、将图片文件转换为pdf,然后在本地下载
链接:http://127.0.0.1:8080/test/img2LocalPdf
四、结果展示