SpringBoot 项目 基于aspose相关jar包 将excel 转换成pdf 导出
2、pom.xml中加入maven引入
< dependency> < groupId> com.aspose.cells</ groupId> < artifactId> cells-8.5.2 </ artifactId> < scope> system</ scope> < systemPath> ${project.basedir}/src/main/resources/libs/aspose-cells-8.5.2.jar</ systemPath> < version> 8.5.2</ version> </ dependency> < dependency> < groupId> com.aspose.words</ groupId> < artifactId> words-15.8.0 </ artifactId> < scope> system</ scope> < systemPath> ${project.basedir}/src/main/resources/libs/aspose-words-15.8.0.jar</ systemPath> < version> 15.8.0</ version> </ dependency>
2.1 使用SpringBoot打包插件生成jar包的时候,你会发现这个jar包不会被打进去,进而出现错误。解决这个问题就需要在maven打包插件中配置一个includeSystemScope属性
< build> < finalName> ${project.artifactId}</ finalName> < plugins> < plugin> < groupId> org.springframework.boot</ groupId> < artifactId> spring-boot-maven-plugin</ artifactId> < configuration> < includeSystemScope> true</ includeSystemScope> </ configuration> </ plugin> </ plugins> </ build>
3、编写转换工具类 如下
package com. by. excelToPdf ; import com. aspose. cells. License ;
import com. aspose. cells. PdfSaveOptions ;
import com. aspose. cells. Workbook ; import java. io. ByteArrayInputStream ;
import java. io. ByteArrayOutputStream ;
import java. io. FileOutputStream ;
import java. io. InputStream ; public class PdfUtil { public static ByteArrayOutputStream excel2pdf ( ByteArrayInputStream is) { ByteArrayOutputStream bos = null ; try { bos = new ByteArrayOutputStream ( ) ; getLicense ( ) ; Workbook wb = new Workbook ( is) ; PdfSaveOptions pdfSaveOptions = new PdfSaveOptions ( ) ; pdfSaveOptions. setOnePagePerSheet ( true ) ; wb. save ( bos, pdfSaveOptions) ; bos. flush ( ) ; bos. close ( ) ; } catch ( Exception e) { System . out. println ( "convert failed" ) ; e. printStackTrace ( ) ; } return bos; } public static void excel2pdf ( String excelFilePath) { excel2pdf ( excelFilePath, null , null ) ; } public static void excel2pdf ( String excelFilePath, int [ ] convertSheets) { excel2pdf ( excelFilePath, null , convertSheets) ; } public static void excel2pdf ( String excelFilePath, String pdfFilePath) { excel2pdf ( excelFilePath, pdfFilePath, null ) ; } public static void excel2pdf ( String excelFilePath, String pdfFilePath, int [ ] convertSheets) { try { pdfFilePath = pdfFilePath == null ? getPdfFilePath ( excelFilePath) : pdfFilePath; getLicense ( ) ; Workbook wb = new Workbook ( excelFilePath) ; FileOutputStream fileOS = new FileOutputStream ( pdfFilePath) ; PdfSaveOptions pdfSaveOptions = new PdfSaveOptions ( ) ; pdfSaveOptions. setOnePagePerSheet ( true ) ; if ( null != convertSheets) { printSheetPage ( wb, convertSheets) ; } wb. save ( fileOS, pdfSaveOptions) ; fileOS. flush ( ) ; fileOS. close ( ) ; System . out. println ( "convert success" ) ; } catch ( Exception e) { System . out. println ( "convert failed" ) ; e. printStackTrace ( ) ; } } private static String getPdfFilePath ( String excelFilePath) { return excelFilePath. split ( "\\." ) [ 0 ] + ".pdf" ; } private static void getLicense ( ) { String licenseFilePath = "excel-license.xml" ; try { InputStream is = PdfUtil . class . getClassLoader ( ) . getResourceAsStream ( licenseFilePath) ; License license = new License ( ) ; license. setLicense ( is) ; } catch ( Exception e) { System . out. println ( "license verify failed" ) ; e. printStackTrace ( ) ; } } private static void printSheetPage ( Workbook wb, int [ ] sheets) { for ( int i = 1 ; i < wb. getWorksheets ( ) . getCount ( ) ; i++ ) { wb. getWorksheets ( ) . get ( i) . setVisible ( false ) ; } if ( null == sheets || sheets. length == 0 ) { wb. getWorksheets ( ) . get ( 0 ) . setVisible ( true ) ; } else { for ( int i = 0 ; i < sheets. length; i++ ) { wb. getWorksheets ( ) . get ( i) . setVisible ( true ) ; } } }
}
4、调用 工具类中有基于流的方式入参、文件地址方式入参等,大家可根据自行需要选择合适的转换方法
public static void main ( String [ ] args) { String inputFile = "D:/testPdf/222.xlsx" ; String outputFile = "D:/testPdf/222.pdf" ; PdfUtil . excel2pdf ( inputFile, outputFile) ; }
5、注意问题,以上转换在windows环境运行一切正常,可能部署到linux环境会存在中文乱码,引起乱码的原因可能是因为linux环境无中文相关字体
linux环境查看字段方法 字体路径/usr/share/fonts
fc-cache
fc-list
fc-list :lang= zh
如果无中文字体 我们可能把windows环境中的字段上传至linux字段目录下,windows环境字段路径C:\Windows\Fonts,上传后安装字段
yum -y install mkfontscale mkfontdir fontconfig
mkfontscale && mkfontdir && fc-cache
如果使用docker 容器启动的应用服务,则还需要使用挂载卷的方式,将宿主体的字体和容器共享,具体方式即启动容器时 加上 “-v /usr/share/fonts/:/usr/share/fonts”