一、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
四、结果展示