SpringBoot集成jasperreport實現打印功能


1.jaspersoft studio工具下載地址

下載直通車

2.工具使用方法查看以下鏈接

工具使用

3.將工具編譯后的.jasper文件放到SpringBoot項目的resources/templates下

image

4.引入需要的jar

<dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>6.18.1</version>
        <exclusions>
            <exclusion>
                <groupId>com.lowagie</groupId>
                <artifactId>itext</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </exclusion>
            <exclusion>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
            </exclusion>
            <exclusion>
                <artifactId>commons-beanutils</artifactId>
                <groupId>commons-beanutils</groupId>
            </exclusion>
            <exclusion>
                <artifactId>commons-collections</artifactId>
                <groupId>commons-collections</groupId>
            </exclusion>
            <exclusion>
                <artifactId>commons-logging</artifactId>
                <groupId>commons-logging</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.lowagie</groupId>
        <artifactId>itext</artifactId>
        <version>2.1.7</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.4.11</version>
    </dependency>
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports-fonts</artifactId>
        <version>6.18.1</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-pdfa</artifactId>
        <version>5.5.0</version>
    </dependency>

ps:jasperreports 、jasperreports-fonts這兩jar的版本取決於使用的jaspersoft studio工具的版本(一定要一致,否則可能出現類型轉換異常)

5.pom文件配置

		<resource>
			<targetPath>${project.build.directory}/classes</targetPath>
			<directory>src/main/resources</directory>
			<filtering>true</filtering>
			<excludes>
				<exclude>**/*.jasper</exclude>
				<exclude>**/*.jrxml</exclude>
			</excludes>
		</resource>
		<resource>
			<targetPath>${project.build.directory}/classes</targetPath>
			<directory>src/main/resources</directory>
			<filtering>false</filtering>
			<includes>
				<include>**/*.jasper</include>
				<include>**/*.jrxml</include>
			</includes>
		</resource>

		<plugin>
			<artifactId>maven-resources-plugin</artifactId>
			<version>2.4</version>
			<configuration>
				<encoding>${project.build.sourceEncoding}</encoding>
				<delimiters>
					<delimiter>$</delimiter>
					<delimiter>@</delimiter>
				</delimiters>
				<useDefaultDelimiters>false</useDefaultDelimiters>
				<outputDirectory>${basedir}/target/classes/</outputDirectory>
				<nonFilteredFileExtensions>
					<!-- 需要過濾掉不需要編碼的文件,不對其進行統一編碼 -->
					<nonFilteredFileExtension>woff</nonFilteredFileExtension>
					<nonFilteredFileExtension>woff2</nonFilteredFileExtension>
					<nonFilteredFileExtension>eot</nonFilteredFileExtension>
					<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
					<nonFilteredFileExtension>svg</nonFilteredFileExtension>
					<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
					<nonFilteredFileExtension>xls</nonFilteredFileExtension>
					<nonFilteredFileExtension>docx</nonFilteredFileExtension>
					<nonFilteredFileExtension>doc</nonFilteredFileExtension>
					<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
					<nonFilteredFileExtension>jasper</nonFilteredFileExtension>
				</nonFilteredFileExtensions>
			</configuration>
		</plugin>

ps:配置要有,否則可能會出現io異常

6.服務代碼,我這里使用的是map傳參的方式

//引入jasper文件
	ClassPathResource resource = new ClassPathResource("templates/collate.jasper");
	try {
		//文件輸入流的兩種獲取方式
//			FileInputStream fis = new FileInputStream(resource.getFile());
		InputStream inputStream = resource.getInputStream();
		Map<String, Object> map = new HashMap<>();
         map.put("userName","zhangsan");
         map.put("pass","123456")
         /**查看底層代碼發現JasperFillManager.fillReport(inputStream, map,new JREmptyDataSource())
          *中有調用(JasperReport) JRLoader.loadObject(inputStream)所以在這里我注掉了
          *如果要使用(JasperReport) JRLoader.loadObject(inputStream)該方法
          *fillReport方法的參數改為JasperFillManager.fillReport(jasperReport, map,new JREmptyDataSource())
          */
//			JasperReport jasperReport = (JasperReport) JRLoader.loadObject(inputStream);
		//將數據源傳遞collate.jasper進行數據拼裝
         //fillReport接口就是處理數據和.jasper文件交互的方法
		JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, map,new JREmptyDataSource());
		/**
		 *JasperCompileManager: 用於編譯JRXML報表模板。
		 *JasperFillManager: 用於填充一個報表,從數據源的數據
		 *JasperPrintManager: 用於打印的JasperReports類庫生成的文件
		 *JasperExportManager: 用於獲取PDF,HTML或XML內容以供報表填充過程中產生的			  *文件
		 *JasperViewer: 它代表了一個簡單的Java Swing應用程序,可以加載和顯示報表。
		 *JasperDesignViewer: 用於在設計時預覽報表模板。
		 */
		//調用打印方法
		JasperPrintManager.printReport(jasperPrint,true);
	} catch (Exception e) {
		e.printStackTrace();
	}

參數解釋:
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, map,new JREmptyDataSource());
//參數1輸入流,即讀取的文件
//參數2數據map集合
//參數3數據源,我這里使用的是map傳參所有數據源給的空數據源對象,必須要有數據源對象
//也可以使用數據源的方式調用,map給個空的hasmap即可,數據源即jdbc連接

7.項目設置

image

8.部署項目到linux時的字體問題解決

image
找到jasper文件中使用的字體,復制到項目resources/fonts下,並且在該目錄下創建fonts.xml文件,fonts.xml文件內容為

<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="華文宋體">
    <normal>fonts/STSONG.TTF</normal>
    <bold>fonts/STSONG.TTF</bold>
    <italic>fonts/STSONG.TTF</italic>
    <boldItalic>fonts/STSONG.TTF</boldItalic>
    <pdfEncoding>Identity-H</pdfEncoding>
    <pdfEmbedded>true</pdfEmbedded>
    <exportFonts>
        <export key="net.sf.jasperreports.html">'華文宋體', Arial, Helvetica, sans-serif</export>
        <export key="net.sf.jasperreports.xhtml">'華文宋體', Arial, Helvetica, sans-serif</export>
    </exportFonts>
</fontFamily>
</fontFamilies>

在resources下創建配置文件jasperreports.properties忽略字體檢測,內容為:

net.sf.jasperreports.awt.ignore.missing.font=true

在resources下創建配置文件jasperreports_extension.properties指定使用的字體配置,內容為:

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=fonts/fonts.xml

9.以下在正常部署項目到linux中啟動報錯headlessException時使用

如果是在linux系統運行可以使用 nohup java -Djava.awt.headless=false -jar xxx.jar >catalina.out 2>&1 &


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM