html模板結合itextpdf生成pdf文檔--demo


這段時間,接到一個需求,是將doc文檔生成pdf文檔。因為doc文檔還挺復雜的,按照網上的示例使用java代碼一個一個生成,那就太復雜了,所以就想到使用html模板來生成pdf文檔。文章結束附代碼鏈接(下載pdf,pdf添加水印文字圖片,poi導出excel,freemarker導出excel)。

步驟:

1.wps打開doc文檔,文件另存為html格式

2.將生成的html復制進項目,如果有圖片,則把同名文件中的圖片復制進項目

3.把html中的圖片路徑替換成正確的路徑

4.檢查html中的標簽是否都正確結束。

5.下載調試,如果有表格等,可能會導致有些邊框出不來,所以需要調試table的td標簽的border屬性。

代碼鏈接:
https://download.csdn.net/download/zj520_/13103967

圖片是我使用demo代碼測試導出的文件:

生成的水印文字,支持多頁生成:

可能遇到的坑:

一、報錯信息: The document has no pages.
原因1:在生成PDF時,需要生成PDF的內容,標簽有誤,在使用itextpdf下載pdf的時候,一定要保證標簽有開始,有結束才行。
比如生成的html文件中的meta標簽,img標簽;
解決:

    <meta http-equiv=Content-Type content="text/html; charset=UTF-8"/>
    <meta name=ProgId content=Word.Document/>
    <meta name=Generator content="Microsoft Word 14"/>
    <meta name=Originator content="Microsoft Word 14"/>
    <img src=""/>	

原因2:使用新版的wps生成的html文檔中含有itextPdf不識別的內容,我這次就因為這個搞了我幾天。后面發現就是在html中有下圖中的內容。
解決:將這些內容刪掉即可

二、java.nio.charset.MalformedInputException: Input length = 1
原因:是因為html的字符編碼的問題,將文件的編碼轉為utf-8即可。
解決:將生成的html文件中的標簽中的

<meta http-equiv=Content-Type content="text/html; charset=gb2312" />

改為:

<meta http-equiv=Content-Type content="text/html; charset=UTF-8" />

三、在使用ftl生成excel的時候,wps生成的xml文件,里面有很多內容不能格式化,可能會導致導出的文件有問題,打不開,所以就只格式化Worksheet標簽內的內容就行了。

四、生成的xls結尾的文檔,使用office打開會提示:"文件格式和擴展名不匹配",但是點擊是,仍然能打開,網上有解決方案,如果有大佬有更好的方案,麻煩留言告知。

使用freemarker導出doc文檔同理,如果有圖片或者表格合並的問題,請點擊鏈接:

https://www.cnblogs.com/pluto-charon/p/10934174.html

-------------------------------------20210107添加--------------------------------------
在項目上線后發現,使用freemarker導出的excel文件,在其他的系統(手機端)導入不進去。但是新建一個excel文件,把內容復制進去,又可以導進去。這肯定是wps生成的excel模板有問題吧,於是我又試了用office/poi生成模板,還是導不進去。然后就使用了下面的這種方式。使用可以導入的文檔,用poi將文件讀取出來,然后再一行一行的設置值(工作量很大),這種方式就可以導入了。至於什么原因,暫時沒有時間研究。。。。。

package com.example.charon;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.springframework.util.ClassUtils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.OpenOption;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * @className: GenerateExcel
 * @description: 讀取模板的方式生成excel
 * @author: charon
 * @create: 2021-01-07 08:18
 */
public class GenerateExcel {
    public static void main(String[] args) throws URISyntaxException, IOException {
        URI uri = ClassUtils.getDefaultClassLoader().getResource("file/pdf/excel").toURI();
        File file = new File(uri.getPath() + "/generate-excel.xls");
        // 如果是xls則使用HSSFWorkbook,如果是xlsx則使用 XSSFWorkbook
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(file));
        // 獲取sheet頁
        Sheet sheet = hssfWorkbook.getSheet("身份信息");
        // 插入數據,如果是固定行數的模板,則需要獲取最大行,然后遍歷忘對應的單元格中插入數據
        for (int i = 0; i < 10; i++) {
            // 因為我的表頭占了兩行
            Row row = sheet.createRow(i+2);
            // 如果是固定模板,則直接getRow,getCell就行了。因為我這邊是
            row.createCell(0).setCellValue("測試姓名"+i);
            row.createCell(1).setCellValue("測試性別"+i);
            row.createCell(2).setCellValue("測試年齡"+i);
            row.createCell(3).setCellValue("測試原籍"+i);
            row.createCell(4).setCellValue("測試現籍"+i);
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        hssfWorkbook.write(baos);
        byte[] outBytes = baos.toByteArray();
        hssfWorkbook.close();
        Path outPath = Paths.get("d://Test-generate-excel.xls");
        Files.write(outPath,outBytes,new OpenOption[0]);
    }
}

導出效果圖:


免責聲明!

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



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