javaweb 報表生成(pdf excel)所需要用到的技術和思路


pdf:

目前開源、成熟、穩定的第三方包只有iText。而用iText生成PDF有三種方式:

  1. 調用iText API,用代碼“寫”出PDF,依賴包:com.itextpdf:itextpdf:5.5.11
  2. 結合XmlWorker,從HTML模板生成PDF,依賴包:com.itextpdf.tool:xmlworker:5.5.11
  3. 結合Flying Saucer,從HTML模板生成PDF,依賴包:org.xhtmlrenderer:flying-saucer-pdf-itext5:9.1.6

這一段是復制別人的,我使用的是第二種方法,直接html轉pdf,這種方式只要用對了就特別方便,如果用代碼寫出pdf,那得上千行java代碼了,非常麻煩

 

開始配置:

網上查找了很久,發現下面這個鏈接幫我避免了很多坑,這些依賴組合好就能正常使用了

http://www.zhimengzhe.com/HTMLjiaocheng/259505.html

所需依賴:

注意:一定要按此版本號引入,不然會出現很多錯誤,包括“中文亂碼、中文不輸出或直接報錯”等異常!

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.4.3</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.1</version>
        </dependency>

 

依賴好了之后,又搜了很久,找到了支持中文的解決方案:

最簡單 iText 的 PDF 生成方案(含中文解決方案)HTML 轉為 PDF  (下面的這個方法的總結參考自此鏈接)

 

 

要點:

所有的單標簽必須閉合(所有單標簽必須全部閉合,否則只要有一個沒閉合,都會報錯 RuntimeWorkerException,

例如: com.itextpdf.tool.xml.exceptions.RuntimeWorkerException: Invalid nested tag head found, expected closing tag meta.  注:這里的報錯不會給出源文件中出錯位置的行數,但是它會給出報錯的標簽,這里給出的是meta沒有正確被關閉,事實上,這里給出的報錯已經很詳細了,在head里找到了無效嵌套,預期的結束了meta標簽,也就是說meta沒閉合,如果是成對標簽少了閉合標簽也會拋出異常,或者單標簽未閉合,也會拋出異常,所以其實還是比較好找的,但是寫的時候一開始就得注意好標簽的閉合問題

另一個要點:如果在文本或者非標簽的地方使用了 < > 這樣的特殊字符,必須寫成實體字符,否則程序在轉pdf的時候會當成正常標簽處理,導致異常關閉標簽,就報錯了

,成對標簽正常寫即可,支持一些基本的html、css,不支持外部link script,不支持js,body以外必須全部按照下面的格式來寫,body以內的,注意每個span都必須配上字體的樣式,否則不能顯示pdf中文文本

 

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body screen_capture_injected="true" ryt11773="1">
    <p>
        <span style="font-size:12.0pt; font-family:MS Mincho">長空</span> <span
            style="font-size:12.0pt; font-family:Times New Roman,serif">(Broken
            Sword),</span> <span style="font-size:12.0pt; font-family:MS Mincho">秦王殘劍</span>
        <span style="font-size:12.0pt; font-family:Times New Roman,serif">(Flying
            Snow),</span> <span style="font-size:12.0pt; font-family:MS Mincho">飛雪</span>
        <span style="font-size:12.0pt; font-family:Times New Roman,serif">(Moon),
        </span> <span style="font-size:12.0pt; font-family:MS Mincho">如月</span> <span
            style="font-size:12.0pt; font-family:Times New Roman,serif">(the
            King), and</span> <span style="font-size:12.0pt; font-family:MS Mincho">秦王</span>
        <span style="font-size:12.0pt; font-family:Times New Roman,serif">(Sky).</span>
    </p>
</body>
</html>

 

再使用java轉換代碼進行轉換即可:

package com.zhouqian.itext;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
 
 
public class D07_ParseHtmlAsian {
 
    
    
    public static final String HTML = "E:/Dropbox/document/java/designPattern/data/hero.html";
    public static final String DEST = "E:/Dropbox/document/java/designPattern/data/hero.pdf";
 
    /**
     * Creates a PDF with the words "Hello World"
     * @param file
     * @throws IOException
     * @throws DocumentException
     */
    public void createPdf(String file) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
        // step 3
        document.open();
        // step 4
        XMLWorkerHelper.getInstance().parseXHtml(writer, document,
                new FileInputStream(HTML), Charset.forName("UTF-8"));
        // step 5
        document.close();
    }
 
    /**
     * Main method
     */
    public static void main(String[] args) throws IOException, DocumentException {
        File file = new File(DEST);
        file.getParentFile().mkdirs();
        new D07_ParseHtmlAsian().createPdf(DEST);
    }
}

 

在指定路徑下就可以得到 PDF 結果:

 

 我測試之后發現能夠正常使用,nice

 

PDF中放入統計圖:

需要用到 jfreechart 來生成圖,然后再把圖片引入html,再轉pdf

https://www.yiibai.com/jfreechart

發現這個易百教程上面的java教程很全面,基本上涵蓋了java的各類技術和組件,都是一些生產上使用廣泛的組件技術,可以用來實現各種需求

 

Excel:

excel的話,使用poi+模板的方式就可以了

 

 

報表生成思路:

pdf:先寫一個基本的符合pdf生成標准(要點:所有的單標簽必須閉合,成對標簽正常些即可,支持一些基本的html、css,不支持外部link script,不支持js,body以外必須全部按照下面的格式來寫,body以內的,注意每個span都必須配上字體的樣式,否則不能顯示pdf中文文本)的html,然后用jsp的方式在特定位置填充數據,想要生成pdf的時候,讓程序自己去訪問剛才的jsp頁面(直接讓程序訪問localhost的頁面位置進行下載即可,使用http/https通道訪問),訪問得到的就是已經填充好數據的html了,然后下載,文件名生成時規定成.html格式的,然后再用上面的html轉pdf即可得到pdf了。

(待續)

 

 

 


免責聲明!

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



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