整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          java初探Tess4j識別圖片文字

          java初探Tess4j識別圖片文字

          學習下識別圖片中的文字,找到了Tess4j圖文識別的方式,于是就初步探究下,玩下識別驗證碼。


          第一步,下載

          1、以3.4.2版本為例,下載Tess4j-3.4.2-src.zip。

          2、下載中文字庫,chi_sim.traineddata。


          下載Tess4j參考:

          http://sourceforge.net/projects/tess4j/

          字庫下載參考:

          https://github.com/tesseract-ocr/tessdata/tree/3.04.00

          api文檔參考:

          http://tess4j.sourceforge.net/docs/docs-3.4/


          第二步,準備工作

          1、解壓Tess4J-3.4.2-src.zip。

          2、把根目錄的lib和dist相關jar拷貝到你的項目lib中。

          3、再把tessdata目錄拷貝到你的項目根目錄中。

          4、再把中文字庫放入tessdata目錄。

          5、dll不用理,Tess4j.jar已經包含。

          6、如果遇到異常,Error: Invalid memory access,Error opening data file ./tessdata/eng.traineddata說明tessdata路徑不對。


          壓縮包目錄:


          如果是使用maven:

          就在pom.xml加入即可。

          <dependency>
              <groupId>net.sourceforge.tess4j</groupId>
              <artifactId>tess4j</artifactId>
              <version>3.4.2</version>
          </dependency>


          我的項目test for java結構:


          Tess4j依賴jar參考:

          commons-beanutils-1.9.2.jar

          commons-io-2.6.jar

          commons-logging-1.2.jar

          ghost4j-1.0.1.jar

          hamcrest-core-1.3.jar

          itext-2.1.7.jar

          jai-imageio-core-1.3.1.jar

          jboss-vfs-3.2.12.Final.jar

          jcl-over-slf4j-1.7.25.jar

          jna-4.1.0.jar

          jul-to-slf4j-1.7.25.jar

          junit-4.12.jar

          lept4j-1.6.2.jar

          log4j-1.2.17.jar

          log4j-over-slf4j-1.7.25.jar

          logback-classic-1.2.3.jar

          logback-core-1.2.3.jar

          slf4j-api-1.7.25.jar

          xmlgraphics-commons-1.5.jar


          第三步,開發測試

          官方簡單例子:

          package net.sourceforge.tess4j.example;
           
          import java.io.File;
          import net.sourceforge.tess4j.*;
           
          public class TesseractExample {
              public static void main(String[] args) {
                  File imageFile = new File("eurotext.tif");
                  ITesseract instance = new Tesseract();  // JNA Interface Mapping
                  // ITesseract instance = new Tesseract1(); // JNA Direct Mapping
           
                  try {
                      String result = instance.doOCR(imageFile);
                      System.out.println(result);
                  } catch (TesseractException e) {
                      System.err.println(e.getMessage());
                  }
              }
          }


          我的初探例子:

          package com.weizhixi;
           
          import net.sourceforge.tess4j.ITesseract;
          import net.sourceforge.tess4j.Tesseract;
          import net.sourceforge.tess4j.util.ImageHelper;
          import javax.imageio.ImageIO;
          import java.awt.image.BufferedImage;
          import java.io.File;
           
          public class Test {
           
              public static void main(String[] args) throws Exception{
                  testEn();
                  //testZh();
              }


          //使用英文字庫 - 識別圖片

              public static void testEn() throws Exception {
                  File imageFile = new File("C:/Users/XQ/Desktop/en.png");
                  BufferedImage image = ImageIO.read(imageFile);
                  //對圖片進行處理
                  image = convertImage(image);
                  ITesseract instance = new Tesseract();//JNA Interface Mapping
                  String result = instance.doOCR(image); //識別
                  System.out.println(result);
              }


          //使用中文字庫 - 識別圖片

              public static void testZh() throws Exception {
                  File imageFile = new File("C:/Users/XQ/Desktop/zh.png");
                  BufferedImage image = ImageIO.read(imageFile);
                  //對圖片進行處理
                  //image = convertImage(image);
                  ITesseract instance = new Tesseract();//JNA Interface Mapping
                  instance.setLanguage("chi_sim");//使用中文字庫
                  String result = instance.doOCR(image); //識別
                  System.out.println(result);
              }


              //對圖片進行處理 - 提高識別度
              public static BufferedImage convertImage(BufferedImage image) throws Exception {
                  //按指定寬高創建一個圖像副本
                  //image = ImageHelper.getSubImage(image, 0, 0, image.getWidth(), image.getHeight());
                  //圖像轉換成灰度的簡單方法 - 黑白處理
                  image = ImageHelper.convertImageToGrayscale(image);
                  //圖像縮放 - 放大n倍圖像
                  image = ImageHelper.getScaledInstance(image, image.getWidth() * 3, image.getHeight() * 3);
                  return image;
              }
           
          }


          處理傾斜圖片:

          如果圖片字體傾斜的,可以用下面代碼糾正

          BufferedImage bi = ImageIO.read(imageFile);
          ImageDeskew id = new ImageDeskew(bi);
          double imageSkewAngle = id.getSkewAngle(); //獲取傾斜角度
          if ((imageSkewAngle > 0.05d || imageSkewAngle < -(0.05d))) {
              bi = ImageHelper.rotateImage(bi, -imageSkewAngle); //糾偏圖像
          }


          測試1:

          測試一張英文截圖en.png。

          未使用圖像簡單處理,運行讀取圖片文字:

          發現有幾次無法準確識別。

          使用convertImage方法對圖像簡單處理,運行讀取圖片文字:

          發現已經完全識別了。


          測試2:

          測試一張中文圖片zh.png

          用不用convertImage,測試結果都正常:


          測試3:

          來點復雜的圖片:

          來看看識別輸出:

          1、未使用圖像處理

          2、使用圖像處理

          發現識別度提高了很多,但部分還是未能夠識別。


          測試4:

          識別干擾度比較低的簡單驗證碼

          識別結果:已經正確識別了。

          經測試多張各種驗證碼,干擾度比較大的,扭曲字體的驗證碼不能識別。


          關于訓字庫

          訓字庫能提高中文字庫的識別度。

          需要下載中文字庫:chi_sim.traindata

          需要下載tesseract-ocr安裝:tesseract-ocr-setup.exe

          需要下載jTessBoxEditor用于修改box文件

          至于怎么訓字庫,這里不展開說了。


          初探總結

          初探了一天,發現初級簡單應用Tess4j:

          1、只能識別幾乎沒有干擾,比較清晰的圖片。

          2、對圖片灰度處理和放大處理,能提高識別度,但不是一定能起作用。

          3、如果不準確的識別,可能要去訓字庫了,如測試識別圖中的逗號,已經變成偏上的點了。

          4、識別度受字體顏色、大小、清晰度、干擾度、扭曲、傾斜等度影響。

          5、官方還提供了一些test例子,還有很多操作和應用。

          初級應用只是簡單的識別,能識別復雜度很大的圖片文字,那是要很多牛B技術和邏輯的大神級操作。

          如果想識別度很高很高幾乎所有都能識別,又要快速集成、建議還是調用第三方識別API了,有些要收費的有些不用收費但有調用頻次限制。


          Demo下載

          由于資源太大,我就不上傳到我網站了。

          請到我的網盤下載:

          鏈接:https://pan.baidu.com/s/1dHje9pR

          密碼:z0bi

          內含:

          1、項目:基于maven_test4j例子項目.zip

          2、官方Tess4j:Tess4J-3.4.2-src.zip

          3、中文訓字庫:chi_sim.traineddata


          轉自:https://www.weizhixi.com/article/59.html

          要功能點:

          Spring Boot Web 整合 JasperReports,在瀏覽器地址欄輸入訪問地址會直接下載 PDF 報表文件;整合過程中遇到的兩個比較費時間的問題:

          1. Maven 依賴包下載失敗:Cannot resolve com.lowagie:itext:2.1.7.js8 ;
          2. 生成的 PDF 文件中中文不顯示。

          1、Maven 依賴

          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
          <dependency>
              <groupId>net.sf.jasperreports</groupId>
              <artifactId>jasperreports</artifactId>
              <version>6.19.1</version>
              <exclusions>
                  <exclusion>
                      <groupId>com.lowagie</groupId>
                      <artifactId>itext</artifactId>
                  </exclusion>
              </exclusions>
          </dependency>
          <dependency>
              <groupId>net.sf.jasperreports</groupId>
              <artifactId>jasperreports-fonts</artifactId>
              <version>6.19.1</version>
          </dependency>
          <dependency>
              <groupId>com.lowagie</groupId>
              <artifactId>itext</artifactId>
              <version>2.1.7</version>
          </dependency>

          2、報表內容

          報表文件名稱:employees-details.jrxml

          報表文件路徑:src\main\resources\employees-details.jrxml

          <?xml version="1.0" encoding="UTF-8"?>
          <!-- Created with Jaspersoft Studio version 6.19.1.final using JasperReports Library version 6.19.1-867c00bf88cd4d784d404379d6c05e1b419e8a4c  -->
          <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Employee" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="37175dba-8b89-474d-8341-09d431dce38f">
              <style name="Table_TH" mode="Opaque" backcolor="#F0F8FF">
                  <box>
                      <pen lineWidth="0.5" lineColor="#000000"/>
                      <topPen lineWidth="0.5" lineColor="#000000"/>
                      <leftPen lineWidth="0.5" lineColor="#000000"/>
                      <bottomPen lineWidth="0.5" lineColor="#000000"/>
                      <rightPen lineWidth="0.5" lineColor="#000000"/>
                  </box>
              </style>
              <style name="Table_TD" mode="Opaque" backcolor="#FFFFFF">
                  <box>
                      <pen lineWidth="0.5" lineColor="#000000"/>
                      <topPen lineWidth="0.5" lineColor="#000000"/>
                      <leftPen lineWidth="0.5" lineColor="#000000"/>
                      <bottomPen lineWidth="0.5" lineColor="#000000"/>
                      <rightPen lineWidth="0.5" lineColor="#000000"/>
                  </box>
              </style>
              <style name="Table_CH" mode="Opaque" backcolor="#BFE1FF">
                  <box>
                      <pen lineWidth="0.5" lineColor="#000000"/>
                      <topPen lineWidth="0.5" lineColor="#000000"/>
                      <leftPen lineWidth="0.5" lineColor="#000000"/>
                      <bottomPen lineWidth="0.5" lineColor="#000000"/>
                      <rightPen lineWidth="0.5" lineColor="#000000"/>
                  </box>
              </style>
              <subDataset name="Dataset1" uuid="01ae53ec-87c9-41de-867d-bd79f5d4e77c">
                  <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
                  <queryString>
                      <![CDATA[]]>
                  </queryString>
                  <field name="id" class="java.lang.Integer"/>
                  <field name="name" class="java.lang.String"/>
                  <field name="role" class="java.lang.String"/>
                  <field name="address" class="java.lang.String"/>
                  <sortField name="id"/>
                  <variable name="totalEmployees" class="java.lang.Integer" calculation="DistinctCount">
                      <variableExpression><![CDATA[$F{id}]]></variableExpression>
                  </variable>
              </subDataset>
              <parameter name="CompanyName" class="java.lang.String"/>
              <parameter name="employeeData" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource"/>
              <queryString>
                  <![CDATA[]]>
              </queryString>
              <field name="name" class="java.lang.String"/>
              <field name="id" class="java.lang.Integer"/>
              <field name="role" class="java.lang.String"/>
              <field name="address" class="java.lang.String"/>
              <background>
                  <band splitType="Stretch"/>
              </background>
              <title>
                  <band height="86" splitType="Stretch">
                      <frame>
                          <reportElement mode="Opaque" x="0" y="0" width="555" height="86" backcolor="#3BE3E3" uuid="57f80b95-2c82-4855-8b4f-797057ea6a99"/>
                          <image scaleImage="FillFrame">
                              <reportElement x="82" y="0" width="410" height="40" uuid="c21b5d52-4d05-448d-a001-a0cd19a9aeb2"/>
                              <imageExpression><![CDATA["E:/1.png"]]></imageExpression>
                          </image>
                          <textField>
                              <reportElement style="Table_TH" mode="Transparent" x="90" y="50" width="400" height="30" backcolor="#FFFFFF" uuid="15957312-bfcc-43e7-ad7c-8cdb97c4197b">
                                  <property name="com.jaspersoft.studio.unit.width" value="px"/>
                              </reportElement>
                              <box padding="0">
                                  <pen lineWidth="1.0" lineStyle="Solid"/>
                                  <topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
                                  <leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
                                  <bottomPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
                                  <rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
                              </box>
                              <textElement>
                                  <font fontName="華文宋體" size="20" isBold="true" isItalic="true" isUnderline="true"/>
                              </textElement>
                              <textFieldExpression><![CDATA[$P{CompanyName}]]></textFieldExpression>
                          </textField>
                      </frame>
                  </band>
              </title>
              <pageHeader>
                  <band height="31" splitType="Stretch">
                      <line>
                          <reportElement x="0" y="15" width="555" height="1" uuid="04a9c4d5-af68-4738-b280-249876a779f3">
                              <property name="com.jaspersoft.studio.unit.height" value="px"/>
                          </reportElement>
                          <graphicElement>
                              <pen lineStyle="Dashed"/>
                          </graphicElement>
                      </line>
                  </band>
              </pageHeader>
              <detail>
                  <band height="170" splitType="Stretch">
                      <property name="com.jaspersoft.studio.unit.height" value="px"/>
                      <componentElement>
                          <reportElement x="0" y="0" width="555" height="170" uuid="58650125-3653-4fa6-9154-b9c084419a71">
                              <property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
                              <property name="com.jaspersoft.studio.table.style.table_header" value="Table_TH"/>
                              <property name="com.jaspersoft.studio.table.style.column_header" value="Table_CH"/>
                              <property name="com.jaspersoft.studio.table.style.detail" value="Table_TD"/>
                          </reportElement>
                          <jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
                              <datasetRun subDataset="Dataset1" uuid="33e34648-091e-48f9-b2c9-2defadbd03fb">
                                  <dataSourceExpression><![CDATA[$P{employeeData}]]></dataSourceExpression>
                              </datasetRun>
                              <jr:column width="100" uuid="fed73b20-211a-48ef-bf45-eb5f50e0d41b">
                                  <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column1"/>
                                  <jr:tableFooter style="Table_TH" height="30" rowSpan="1">
                                      <staticText>
                                          <reportElement x="0" y="0" width="100" height="30" uuid="b219724f-df88-4066-8fc3-db986efed088"/>
                                          <textElement textAlignment="Center" verticalAlignment="Middle"/>
                                          <text><![CDATA[Total Employees=]]></text>
                                      </staticText>
                                  </jr:tableFooter>
                                  <jr:columnHeader style="Table_CH" height="30" rowSpan="1">
                                      <staticText>
                                          <reportElement x="0" y="0" width="100" height="30" uuid="6e4a6eb9-7503-46c2-b199-cb78736d4827"/>
                                          <textElement textAlignment="Center" verticalAlignment="Middle">
                                              <font fontName="華文宋體"/>
                                          </textElement>
                                          <text><![CDATA[ID]]></text>
                                      </staticText>
                                  </jr:columnHeader>
                                  <jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
                                  <jr:detailCell style="Table_TD" height="30">
                                      <textField>
                                          <reportElement x="0" y="0" width="100" height="30" uuid="e04148fe-4406-4817-bf7c-a75a1837a834"/>
                                          <textElement textAlignment="Center" verticalAlignment="Middle">
                                              <font fontName="華文宋體"/>
                                          </textElement>
                                          <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
                                      </textField>
                                  </jr:detailCell>
                              </jr:column>
                              <jr:column width="100" uuid="c805b32b-9978-4ad9-93c8-64fb6ebdc310">
                                  <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column2"/>
                                  <jr:tableFooter style="Table_TH" height="30" rowSpan="1">
                                      <textField>
                                          <reportElement x="0" y="0" width="100" height="30" uuid="8b6f3603-5468-4ed8-92d6-2744856cfbec"/>
                                          <textElement textAlignment="Center" verticalAlignment="Middle"/>
                                          <textFieldExpression><![CDATA[$V{totalEmployees}]]></textFieldExpression>
                                      </textField>
                                  </jr:tableFooter>
                                  <jr:columnHeader style="Table_CH" height="30" rowSpan="1">
                                      <staticText>
                                          <reportElement x="0" y="0" width="100" height="30" uuid="ae32a33c-1f5c-4045-b8d6-738226f2881e"/>
                                          <textElement textAlignment="Center" verticalAlignment="Middle">
                                              <font fontName="華文宋體"/>
                                          </textElement>
                                          <text><![CDATA[員工姓名]]></text>
                                      </staticText>
                                  </jr:columnHeader>
                                  <jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
                                  <jr:detailCell style="Table_TD" height="30">
                                      <textField>
                                          <reportElement x="0" y="0" width="100" height="30" uuid="ce7df570-525d-4bb1-9ed3-a63c0b387bbd"/>
                                          <textElement textAlignment="Center" verticalAlignment="Middle">
                                              <font fontName="華文宋體"/>
                                          </textElement>
                                          <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
                                      </textField>
                                  </jr:detailCell>
                              </jr:column>
                              <jr:column width="40" uuid="bd04119c-8493-4333-952a-2aeac29db62b">
                                  <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column3"/>
                                  <jr:tableFooter style="Table_TH" height="30" rowSpan="1"/>
                                  <jr:columnHeader style="Table_CH" height="30" rowSpan="1">
                                      <staticText>
                                          <reportElement x="0" y="0" width="40" height="30" uuid="37ee0454-22df-4056-a40e-f52f82d29f95"/>
                                          <textElement textAlignment="Center" verticalAlignment="Middle">
                                              <font fontName="華文宋體"/>
                                          </textElement>
                                          <text><![CDATA[角色]]></text>
                                      </staticText>
                                  </jr:columnHeader>
                                  <jr:columnFooter style="Table_CH" height="30" rowSpan="1"/>
                                  <jr:detailCell style="Table_TD" height="30">
                                      <textField>
                                          <reportElement x="0" y="0" width="40" height="30" uuid="a789a863-4232-4279-8a66-be83206747fe"/>
                                          <textElement textAlignment="Center" verticalAlignment="Middle">
                                              <font fontName="華文宋體"/>
                                          </textElement>
                                          <textFieldExpression><![CDATA[$F{role}]]></textFieldExpression>
                                      </textField>
                                  </jr:detailCell>
                              </jr:column>
                              <jr:column width="200" uuid="f32f724a-24c9-4887-ba41-5957dd0fed1d">
                                  <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column4"/>
                                  <jr:tableFooter style="Table_TH" height="30" rowSpan="1"/>
                                  <jr:columnHeader style="Table_CH" height="30" rowSpan="1">
                                      <staticText>
                                          <reportElement x="0" y="0" width="200" height="30" uuid="ced8b636-0cef-488f-89c4-9988b81415db"/>
                                          <textElement textAlignment="Center" verticalAlignment="Middle">
                                              <font fontName="華文宋體"/>
                                          </textElement>
                                          <text><![CDATA[地址]]></text>
                                      </staticText>
                                  </jr:columnHeader>
                                  <jr:columnFooter style="Table_CH" height="30" rowSpan="1">
                                      <property name="com.jaspersoft.studio.unit.width" value="px"/>
                                  </jr:columnFooter>
                                  <jr:detailCell style="Table_TD" height="30">
                                      <textField>
                                          <reportElement x="0" y="0" width="200" height="30" uuid="958c39bd-fd6f-4414-9700-579e0c8ee7d9"/>
                                          <textElement textAlignment="Center" verticalAlignment="Middle">
                                              <font fontName="華文宋體"/>
                                          </textElement>
                                          <textFieldExpression><![CDATA[$F{address}]]></textFieldExpression>
                                      </textField>
                                  </jr:detailCell>
                              </jr:column>
                          </jr:table>
                      </componentElement>
                  </band>
              </detail>
              <pageFooter>
                  <band height="50" splitType="Stretch">
                      <textField>
                          <reportElement x="350" y="20" width="100" height="30" uuid="9ab9485d-d510-496f-9dcd-dae944a4ae43"/>
                          <textElement textAlignment="Right"/>
                          <textFieldExpression><![CDATA["Page " + $V{PAGE_NUMBER}]]></textFieldExpression>
                      </textField>
                      <textField evaluationTime="Report">
                          <reportElement x="455" y="20" width="100" height="30" uuid="a534e5d1-aa1b-4a87-9149-d7a052cbc01f"/>
                          <textFieldExpression><![CDATA[" of " + $V{PAGE_NUMBER}]]></textFieldExpression>
                      </textField>
                  </band>
              </pageFooter>
          </jasperReport>

          3、字體配置

          字體文件位置:src\main\resources\static\font\chinese.stsong.ttf

          字體配置文件位置:src\main\resources\static\font\fonts.xml

          配置文件內容

          <?xml version="1.0" encoding="UTF-8"?>
          <fontFamilies>
              <fontFamily name="華文宋體">
                  <normal>static/font/chinese.stsong.ttf</normal>
                  <bold>static/font/chinese.stsong.ttf</bold>
                  <italic>static/font/chinese.stsong.ttf</italic>
                  <boldItalic>static/font/chinese.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>

          在 classpath 路徑下(application.properties 同級)創建 Jasper 拓展文件 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=static/font/fonts.xml

          4、實體對象 —— Employee.java

          @Data
          @NoArgsConstructor
          public class Employee {
          
              private int id;
              private String name;
              private String role;
              private String address;
          
              public Employee(int id, String name, String role, String address) {
                  this.id=id;
                  this.name=name;
                  this.role=role;
                  this.address=address;
              }
          }

          5、控制器 —— EmployeeController.java

          @RestController
          public class EmployeeController {
          
              @GetMapping("/employee/records/report")
              public ResponseEntity<byte[]> getEmployeeRecordReport() {
                  try {
                      // 測試數據
                      List<Employee> empLst=createTestData();
          
                      // 報表需要的動態參數
                      Map<String, Object> empParams=new HashMap<String, Object>();
                      empParams.put("CompanyName", "Spring Boot 整合 JasperReports");
                      empParams.put("employeeData", new JRBeanCollectionDataSource(empLst));
          
                      // 編譯
                      JasperReport jasperReport=JasperCompileManager.compileReport(
                              ResourceUtils.getFile("classpath:employees-details.jrxml").getAbsolutePath()
                      );
          
                      // 填充數據
                      JasperPrint jasperPrint=JasperFillManager.fillReport(jasperReport, empParams, new JREmptyDataSource());
          
                      // 導出報表
                      HttpHeaders headers=new HttpHeaders();
                      // 設置響應格式:PDF
                      headers.setContentType(MediaType.APPLICATION_PDF);
                      // 設置文件名稱
                      headers.setContentDispositionFormData("filename", "employees-details.pdf");
                      return new ResponseEntity<byte[]>(JasperExportManager.exportReportToPdf(jasperPrint), headers, HttpStatus.OK);
          
                  } catch (Exception e) {
                      e.printStackTrace();
                      return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
                  }
              }
          
              private List<Employee> createTestData() {
                  List<Employee> resultList=new ArrayList<>();
                  resultList.add(new Employee(1, "汪小成", "程序員", "山東省濟寧市任城區"));
                  resultList.add(new Employee(2, "孫小順", "部門經理", "安徽省合肥市蜀山區"));
                  return resultList;
              }
          }

          6、查看效果

          在谷歌瀏覽器地址欄輸入 http://localhost:9000/employee/records/report 會直接彈出保存文件的對話框,實際效果如下:

          附錄

          itext-2.1.7.js8.jar 可以在如下地址下載:

          https://jaspersoft.jfrog.io/ui/native/third-party-ce-artifacts/com/lowagie/itext/2.1.7.js8/

          這里搜集了用來構建應用程序的工具。

          • Apache Maven:Maven使用聲明進行構建并進行依賴管理,偏向于使用約定而不是配置進行構建。Maven優于Apache Ant。后者采用了一種過程化的方式進行配置,所以維護起來相當困難。
          • Gradle:Gradle采用增量構建。Gradle通過Groovy編程而不是傳統的XML聲明進行配置。Gradle可以很好地配合Maven進行依賴管理,并且把Ant腳本當作頭等公民。

          字節碼操作

          編程操作Java字節碼的函數庫。

          • ASM:通用底層字節碼操作及分析。
          • Javassist:嘗試簡化字節碼編輯。
          • Byte Buddy:使用“流式API”進一步簡化字節碼生成。

          代碼分析

          軟件度量和質量評估工具。

          • Checkstyle:對編程規范和標準進行靜態分析。
          • FindBugs:通過字節碼靜態分析找出潛在Bug。
          • PMD:對源代碼中不良編程習慣進行分析。
          • SonarQube:通過插件集成其它分析組件,提供評估最終結果報告。

          編譯器

          創建分析器、解釋器和編譯器的框架。

          • ANTLR:功能完備的自頂向下分析復雜框架。
          • JavaCC:相對ANTLR更具體,上手略為簡單。支持語法語法超前預測(syntactic lookahead)。

          持續集成

          支持持續集成、測試和應用發布的工具。

          • Bamboo:Atlassian的持續集成(CI)解決方案,包含很多其它產品。
          • CircleCI:提供托管服務,可免費試用。
          • Codeship:提供托管服務,提供有限免費計劃。
          • Go:ThoughtWork開源持續集成解決方案。
          • Jenkins:提供基于服務器的部署服務。
          • TeamCity:JetBrain持續集成方案,提供免費版。
          • Travis:提供托管服務,常用于開源項目。

          數據庫

          簡化數據庫交互的工具、庫。

          • Flyway:使用Java API輕松完成數據庫遷移。
          • H2:小型SQL數據庫,以內存操作著稱。
          • JDBI:便捷的JDBC抽象。
          • jOOQ:基于SQL schema生成類型安全代碼。
          • Presto:針對大數據的分布式SQL查詢引擎。
          • Querydsl:針對Java的類型安全統一查詢。

          日期和時間

          處理日期和時間的函數庫。

          • Joda-Time:Java 8出現之前,它是日期、時間處理的標準函數庫。
          • Time4J:Java高級日期、時間函數庫。

          依賴注入

          幫助代碼實現控制反轉模式的函數庫。

          • Dagger :編譯期的注入框架,沒有使用反射,主要用于Android開發。
          • Guice:輕量級注入框架,功能強大可與Dagger媲美。

          開發庫

          從基礎層次上改進開發流程。

          • AspectJ:面向切面編程擴展,與程序無縫連接。
          • Auto:源代碼生成器集合。
          • DCEVM:通過修改JVM,在運行時可無限次重定義已加載的類。OpenJDK 7、8已提供支持,詳情可查看這個分支(fork)。
          • JRebel:商用軟件,無需重新部署可即時重新加載代碼及配置。
          • Lombok:代碼生成器,旨在減少Java冗余代碼。
          • RxJava:使用JVM中可觀察序列,創建異步、基于事件應用程序的函數庫。
          • Spring Loaded:另一個JVM類重載代理。
          • vert.x:JVM多語言事件驅動應用框架。

          分布式應用

          用來開發分布式、具有容錯性應用程序的函數庫和框架。

          • Akka:構建并發、分布式和具有容錯功能的事件驅動應用程序所需的工具包和運行時。
          • Apache Storm:分布式實時計算系統。
          • Apache ZooKeeper:為大型分布式系統,使用分布式配置、同步和命名注冊提供協調服務。
          • Hazelcast:分布式、高可擴展性內存網格。
          • Hystrix:為分布式系統提供延遲和容錯處理。
          • JGroups:一組提供可靠消息傳輸的工具包,可用來創建集群。集群中的節點可互相發送消息。
          • Quasar:為JVM提供輕量級線程和Actor。

          發布

          使用本機格式分發Java應用程序的工具。

          • Bintray:對二進制發布進行版本控制,可與Maven或Gradle配合使用。
          • IzPack:為跨平臺部署建立授權工具。
          • Launch4j:將JAR包裝為小巧的Windows可執行文件。
          • packr:將程序JAR、資源和JVM打包成Windows、Linux和Mac OS X的本機文件。

          文檔處理

          用來處理Office格式文檔的函數庫。

          • Apache POI:支持OOXML (XLSX、DOCX、PPTX)以及 OLE2 (XLS, DOC or PPT)格式的文檔。
          • jOpenDocument:處理OpenDocument格式文檔。

          游戲開發

          游戲開發框架。

          • jMonkeyEngine:支持現代3D開發的游戲引擎。
          • libGDX:全面的跨平臺高級開發框架。
          • LWJGL:抽象了OpenGL、CL、AL等函數庫的健壯框架。

          GUI

          用來創建現代圖形用戶界面的函數庫。

          • JavaFX:Swing的繼承者。
          • Scene Builder:JavaFX虛擬布局工具。

          高性能

          與高性能計算有關的資源,包括集合以及很多具體功能的函數庫。

          • Disruptor:線程間消息函數庫。
          • fastutil:快速緊湊的Java類型安全集合。
          • GS Collections:受Smalltalk啟發的集合框架。
          • hftc:Hash set和hash map。
          • HPPC:基本類型集合。
          • Javolution:針對實時嵌入式系統的函數庫。
          • Trove:基本類型集合。

          IDE

          視圖簡化開發的集成開發環境。

          • Eclipse:后臺做了很多工作,以其豐富插件著稱。
          • IntelliJ IDEA:支持很多JVM語言,為Android開發提供了很多不錯的選項。其商業版本主要面向企業用戶。
          • NetBeans:集成了很多Java SE和Java EE特性,包括數據庫訪問、服務器、HTML5以及AngularJS。

          圖像處理

          用來幫助創建、評估或操作圖形的函數庫。

          • Picasso:Android下載圖像和圖像緩存函數庫。
          • ZXing:Google出的多種格式的一維、二維條形碼處理函數庫。QCode:小日本寫的生成二維碼工具



          JSON

          簡化JSON處理的函數庫。

          • Gson:將Java對象序列化為JSON及反向操作。使用時提供了很好的性能。
          • Jackson:與GSON類似,但如果需要頻繁初始化Jackson庫會帶來性能問題。

          JVM和JDK

          目前的JVM、JDK實現。

          • JDK 9:JDK 9早期訪問版本。
          • OpenJDK:開源實現。

          日志

          記錄應用程序的日志函數庫。

          • Apache Log4j 2:對之前版本進行了完全重寫。現在的版本具備一個強大的插件和配置架構。
          • kibana:對日志進行分析并進行可視化。
          • Logback:Log4j原班人馬作品。被證明是一個強健的日志函數庫,通過Groovy提供了很多有意思的配置選項。
          • logstash:日志文件管理工具。
          • SLF4J:日志抽象層,需要與某個具體日志框架配合使用。

          機器學習

          提供具體統計算法的工具。其算法可從數據中學習。

          • Apache Hadoop:對商用硬件集群上大規模數據存儲和處理的開源軟件框架。
          • Apache Mahout:專注協同過濾、聚類和分類的可擴展算法。
          • Apache Spark:開源數據分析集群計算框架。
          • h2o:用作大數據統計的分析引擎。
          • Weka:用作數據挖掘的算法集合,包括從預處理到可視化的各個層次。

          消息

          在客戶端之間進行消息傳遞,確保協議獨立性的工具。

          • Apache ActiveMQ:實現JMS的開源消息代理(broker),可將同步通訊轉為異步通訊。
          • Apache Kafka:高吞吐量分布式消息系統。
          • JBoss HornetQ:清晰、準確、模塊化且方便嵌入的消息工具。
          • JeroMQ:ZeroMQ的純Java實現。

          其它

          其它資源。

          • Design Patterns:實現并解釋了最常見的設計模式。
          • Jimfs:內存文件系統。
          • Lanterna:類似curses的簡單console文本GUI函數庫。
          • LightAdmin:可插入式CRUD UI函數庫,可用于快速應用開發。
          • Metrics:創建自己的軟件度量或者為支持框架添加度量信息,通過JMX或HTTP進行發布或者發送到數據庫。
          • OpenRefine:用來處理混亂數據的工具,包括清理、轉換、使用Web Service進行擴展并將其關聯到數據庫。
          • RoboVM:Java編寫原生iOS應用。

          自然語言處理

          用來專門處理文本的函數庫。

          • Apache OpenNL:處理類似分詞等常見任務的工具。
          • CoreNLP:斯坦佛的CoreNLP提供了一組基礎工具,可以處理類似標簽、實體名識別和情感分析這樣的任務。
          • LingPipe:一組可以處理各種任務的工具集,支持POS標簽、情感分析等。
          • Mallet:統計學自然語言處理、文檔分類、聚類、主題建模等。

          網絡

          網絡編程函數庫。

          • Netty:構建高性能網絡應用程序開發框架。
          • OkHttp :一個Android和Java應用的HTTP+SPDY客戶端。

          ORM

          處理對象持久化的API。

          • EclipseLink:支持許多持久化標準,JPA、JAXB、JCA和SDO。
          • Hibernate:廣泛使用、強健的持久化框架。Hibernate的技術社區非常活躍。
          • Ebean:支持快速數據訪問和編碼的ORM框架。

          PDF

          用來幫助創建PDF文件的資源。

          • Apache FOP:從XSL-FO創建PDF。
          • Apache PDFBox:用來創建和操作PDF的工具集。
          • DynamicReports:JasperReports的精簡版。
          • iText:一個易于使用的PDF函數庫,用來編程創建PDF文件。注意,用于商業用途時需要許可證。
          • JasperReports:一個復雜的報表引擎。

          REST框架

          用來創建RESTful 服務的框架。

          • Dropwizard:偏向于自己使用的Web框架。用來構建Web應用程序,使用了Jetty、Jackson、Jersey和Metrics。
          • Jersey:JAX-RS參考實現。
          • RESTEasy:經過JAX-RS規范完全認證的可移植實現。
          • Retrofit:一個Java類型安全的REST客戶端。
          • Spark:受到Sinatra啟發的Java REST框架。
          • Swagger:Swagger是一個規范且完整的框架,提供描述、生產、消費和可視化RESTful Web Service。

          科學

          用于科學計算和分析的函數庫。

          • SCaVis:用于科學計算、數據分析和數據可視化環境。

          搜索

          文檔索引引擎,用于搜索和分析。

          • Apache Solr :一個完全的企業搜索引擎。為高吞吐量通信進行了優化。
          • Elasticsearch:一個分布式、支持多租戶(multitenant)全文本搜索引擎。提供了RESTful Web接口和無schema的JSON文檔。

          安全

          用于處理安全、認證、授權或會話管理的函數庫。

          • Apache Shiro:執行認證、授權、加密和會話管理。
          • Cryptomator:在云上進行客戶端跨平臺透明加密。
          • Keycloak:為瀏覽器應用和RESTful Web Service集成SSO和IDM。目前還處于beta版本,但是看起來非常有前途。
          • PicketLink:PicketLink是一個針對Java應用進行安全和身份認證管理的大型項目(Umbrella Project)。
          • Spring Security:專注認證、授權和多維度攻擊防護框架。

          序列化

          用來高效處理序列化的函數庫。

          • FlatBuffers:序列化函數庫,高效利用內存,無需解包和解析即可高效訪問序列化數據。
          • Kryo:快速和高效的對象圖形序列化框架。
          • MessagePack:一種高效的二進制序列化格式。

          服務器

          用來部署應用程序的服務器。

          • Apache Tomcat:針對Servlet和JSP的應用服務器,健壯性好且適用性強。
          • Apache TomEE:Tomcat加Java EE。
          • GlassFish:Java EE開源參考實現,由Oracle資助開發。
          • Jetty:輕量級、小巧的應用服務器,通常會嵌入到項目中。
          • WildFly:之前被稱作JBoss,由Red Hat開發。支持很多Java EE功能。

          模版引擎

          對模板中表達式進行替換的工具。

          • Apache Velocity:提供HTML頁面模板、email模板和通用開源代碼生成器模板。
          • FreeMarker:通用模板引擎,不需要任何重量級或自己使用的依賴關系。
          • Handlebars.java:使用Java編寫的模板引擎,邏輯簡單,支持語義擴展(semantic Mustache)。
          • JavaServer Pages:通用網站模板,支持自定義標簽庫。
          • Thymeleaf:旨在替換JSP,支持XML文件。

          測試

          測試內容從對象到接口,涵蓋性能測試和基準測試工具。

          • Apache JMeter:功能性測試和性能評測。
          • Arquillian:集成測試和功能行測試平臺,集成Java EE容器。
          • AssertJ:支持流式斷言提高測試的可讀性。
          • JMH:JVM微基準測試工具。
          • JUnit:通用測試框架。
          • Mockito:在自動化單元測試中創建測試對象,為TDD或BDD提供支持。
          • Selenium:為Web應用程序提供可移植軟件測試框架。
          • Selenide:為Selenium提供精準的周邊API,用來編寫穩定且可讀的UI測試。
          • TestNG :測試框架。
          • VisualVM:提供可視化方式查看運行中的應用程序信息。

          工具類

          通用工具類函數庫。

          • Apache Commons:提供各種用途的函數,比如配置、驗證、集合、文件上傳或XML處理等。
          • Guava:集合、緩存、支持基本類型、并發函數庫、通用注解、字符串處理、I/O等。
          • javatuples:正如名字表示的那樣,提供tuple支持。盡管目前tuple的概念還有留有爭議。

          網絡爬蟲

          用于分析網站內容的函數庫。

          • Apache Nutch :可用于生產環境的高度可擴展、可伸縮的網絡爬蟲。
          • Crawler4j:簡單的輕量級爬蟲。
          • JSoup :刮取、解析、操作和清理HTML。

          Web框架

          用于處理Web應用程序不同層次間通訊的框架。

          • Apache Tapestry:基于組件的框架,使用Java創建動態、強健的、高度可擴展的Web應用程序。
          • Apache Wicket:基于組件的Web應用框架,與Tapestry類似帶有狀態顯示GUI。
          • Google Web Toolkit:一組Web開發工具集,包含在客戶端將Java代碼轉為JavaScript的編譯器、XML解析器、RCP API、JUnit集成、國際化支持和GUI控件。
          • Grails:Groovy框架,旨在提供一個高效開發環境,使用約定而非配置、沒有XML并支持混入(mixin)。
          • Play: 使用約定而非配置,支持代碼熱加載并在瀏覽器中顯示錯誤。
          • PrimeFaces:JSF框架,提供免費版和帶技術支持的商業版。包含一些前端組件。
          • Spring Boot:微框架,簡化了Spring新程序的開發過程。
          • Spring:旨在簡化Java EE的開發過程,提供依賴注入相關組件并支持面向切面編程。
          • Vaadin:基于GWT構建的事件驅動框架。使用服務端架構,客戶端使用Ajax。
          • Ninja:Java全棧Web開發框架。非常穩固、快速和高效。
          • Ratpack:一組Java開發函數庫,用于構建快速、高效、可擴展且測試完備的HTTP應用程序。

          資源

          社區

          活躍的討論區。

          • r/java:Java社區的Subreddit。
          • stackoverflow:問答平臺。

          有影響的書籍

          具有廣泛影響且值得閱讀的Java經典書籍。

          • Effective Java (2nd Edition)
          • Java Concurrency in Practice | Java并發編程實戰
          • Thinking in Java | 中文版

          播客

          可以一邊編程一邊聽的東西。

          • The Java Posse

          Twitter

          值得關注的帳號。

          • Adam Bien:自由職業者、作家、JavaONE明星演講者、顧問、Java Champion。
          • Antonio Goncalves:Java Champion、JUG Leader、Devoxx France、Java EE 6/7、JCP、作家。
          • Arun Gupta:Java Champion、JavaONE明星演講者、JUG Leader、Devoxx4Kids成員、Red Hatter。
          • Bruno Borges:Oracle產品經理、Java Jock。
          • Ed Burns:Oracle技術團隊顧問。
          • Eugen Paraschiv:Spring安全課程作者。
          • James Weaver:Java、JavaFX、IoT開發者、作者和演講者。
          • Java EE:Java EE Twitter官方賬號。
          • Java Magazine:Java雜志官方賬號。
          • Java.net:Java.net官方賬號。
          • Java:Java Twitter官方賬號。
          • Javin Paul:知名Java博客作者。
          • Lukas Eder:Data Geekery(jOOQ)創始人兼CEO。
          • Mario Fusco:RedHatter、JUG協調、活躍講師和作者。
          • Mark Reinhold:Oracle首席架構師、Java平臺開發組。
          • Martijn Verburg:London JUG co-leader、演講者、作家、Java Champion等。
          • OpenJDK:OpenJDK官方賬號。
          • Reza Rahman:Java EE、GlassFish、WebLogic傳道者、作家、演講者、開源黑客。
          • Simon Maple:Java Champion、virtualJUG創始人、LJC leader、RebelLabs作者。
          • Stephen Colebourne: Java Champion、演講者。
          • Tim Boudreau:作家、NetBeans大牛。
          • Trisha Gee:Java Champion、演講者。

          網站

          值得閱讀的網站。

          • Google Java Style
          • InfoQ
          • Java Code Geeks
          • Java.net
          • Javalobby
          • JavaWorld
          • RebelLabs
          • The Java Specialist’ Newsletter
          • TheServerSide.com
          • Thoughts On Java
          • ImportNew(ImportNew 專注 Java 技術)

          主站蜘蛛池模板: 国产精品无码一区二区三级| 国产精品亚洲一区二区无码| 成人毛片一区二区| 亚洲av色香蕉一区二区三区| 亚洲视频在线一区二区| 亚洲国产成人一区二区精品区| 日本伊人精品一区二区三区| 国产精品无码一区二区在线观| 久久精品国产亚洲一区二区三区| 亚洲一区中文字幕| 久久se精品一区二区| 在线一区二区观看| 怡红院一区二区在线观看| 中文字幕一区二区人妻| 午夜视频在线观看一区二区| 精品一区二区ww| 无码少妇一区二区性色AV| 国产精品福利区一区二区三区四区| 精品国产aⅴ无码一区二区| 无码AV中文一区二区三区| 中文字幕亚洲一区二区va在线| 无码午夜人妻一区二区不卡视频| 五月婷婷一区二区| 亚洲综合在线成人一区| 2022年亚洲午夜一区二区福利| 中文字幕亚洲一区二区va在线| 中文字幕一区二区三区永久| 国产精品福利区一区二区三区四区 | 中文字幕在线无码一区二区三区| 国模吧一区二区三区精品视频| 国产一区二区三区乱码在线观看| 亚洲色无码专区一区| 性色av闺蜜一区二区三区| 国产伦精品一区二区三区在线观看| 免费观看日本污污ww网站一区 | 国产精品成人国产乱一区| 亚洲国产精品一区二区九九| 久久免费精品一区二区| 91在线精品亚洲一区二区| 日韩精品免费一区二区三区 | 中文字幕在线一区二区三区|