ftl轉pdf及問題集錦


這是一個令人悲傷的問題,本人在網上大量查找資料,總是有這樣那樣的問題導致不能轉換成功

引入的maven     jar包如下

    <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.4.3</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.5</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.xhtmlrenderer</groupId>
            <artifactId>core-renderer</artifactId>
            <version>R8</version>
        </dependency>

 

參考了很多資料,我選擇的是  https://blog.csdn.net/NetSnake_/article/details/77161106   作為參考

@RequestMapping("/printingcontractNew")
    public void printingcontractNew( HttpServletResponse response,Long orderId,HttpServletRequest request) throws Exception {


        Map<String, Object> map = new HashMap<String, Object>();
        map.put("orderContract", order);
        map.put("orderinformation", orderinformation);

      //輸入需要傳輸的數據
        try {
            ByteArrayOutputStream baos = FtlToPdf1.createPDF(request, "PrintingContract.ftl", map);    //"PrintingContract.ftl"為自己的ftl能展示的(注意結構必須嚴謹)
            System.out.println(baos);
            //設置response文件頭
             FtlToPdf1.renderPdf(response, baos.toByteArray(), "789");    //789  為輸出pdf的名字可以自己命名
        } catch (Exception e) {
            throw new Exception(e);
        }


      /*  ftlTOPDF.FTL2PDF(srcPath, destPath, map);*/
    }
package com.ningpai.site.pdf;

/*import com.lowagie.text.pdf.BaseFont;*/

import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.itextpdf.text.Font;
import com.itextpdf.text.Document;
import com.itextpdf.text.Paragraph;
/*
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
*/

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 * Created by Administrator on 2018-5-19.
 */
public class FtlToPdf1 {

    /**
     * 生成PDF文件流
     * @param request
     * @param ftlName 文件名稱
     * @param root  數據
     * @return ByteArrayOutputStream
     * @throws Exception
     */
    public static ByteArrayOutputStream createPDF(HttpServletRequest request, String ftlName, Object root) throws Exception {
        String basePath = request.getSession().getServletContext().getRealPath("/");//絕對路徑
        Configuration cfg = new Configuration();
        try {
            cfg.setLocale(Locale.CHINA);
            cfg.setEncoding(Locale.CHINA, "UTF-8");
            //設置編碼
            cfg.setDefaultEncoding("UTF-8");
            //設置模板路徑
            cfg.setDirectoryForTemplateLoading(new File(basePath + "view/contract/"));

            //獲取模板
            Template template = cfg.getTemplate(ftlName);
            template.setEncoding("UTF-8");

            ITextRenderer iTextRenderer = new ITextRenderer();
            //設置字體
            ITextFontResolver fontResolver = iTextRenderer.getFontResolver();
            fontResolver.addFont(basePath + "view/contract/simsun.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);    "view/contract/simsun.ttf"  為下載的字體將其放入程序中的位置

            Writer writer = new StringWriter();
            //數據填充模板
            template.process(root, writer);
            //設置輸出文件內容及路徑
            String str = writer.toString();
            iTextRenderer.setDocumentFromString(str);
            iTextRenderer.getSharedContext().setBaseURL("file:/D:");  //圖片共享路徑file:/home/ddcj/
            iTextRenderer.layout();
            //生成PDF
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            iTextRenderer.createPDF(baos);      //這里會顯示有亂碼  , 但對最后輸出結果沒有影響
            baos.close();

            return baos;
        } catch(Exception e) {
            throw new Exception(e);
        }
    }

    //此方法主要是設置文件頭,並把文件作為附件下載
    public static void renderPdf(HttpServletResponse response, final byte[] bytes, final String filename) {
        setFileDownloadHeader(response, filename, ".pdf");
        if (null != bytes) {
            try {
                response.getOutputStream().write(bytes);
                response.getOutputStream().flush();
            } catch (IOException e) {
                throw new IllegalArgumentException(e);
            }
        }
    }

    /**
     * 設置讓瀏覽器彈出下載對話框的Header.
     * @param fileName 下載后的文件名.
     */
    public static void setFileDownloadHeader(HttpServletResponse response, String fileName, String fileType) {
        try {
            // 中文文件名支持
            String encodedfileName = new String(fileName.getBytes("GBK"), "ISO8859-1");
            response.setHeader("Content-Disposition", "attachment; filename=\"" + encodedfileName + fileType + "\"");
        } catch (UnsupportedEncodingException e) {
        }
    }
}

效果圖如下:

點擊打印

 

 

打開后

 

 格式有點丑,還沒開始修改...

 

 

問題集錦:

1.org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). org.xml.sax.SAXParseException; lineNumber: 167; columnNumber: 44; 元素類型 "td" 必須由匹配的結束標記 "</td>" 終止。

報錯的代碼如下:

   <tr>
                    <td class="product_table_th">供方:xxx</br>地址:xxx</br>電話:028-3xxxx59</br>傳真:028-xxxxx909</br>
                        開戶銀行:中國建設xxx分行</br>賬號:5100 xxxx xxxx xxx1 0200
                    </td>
                    <td class="product_table_th">需方:${orderinformation.invoiceCompanyName}</br>地址:${orderinformation.invoiceSite} </br>
                        電話:${orderinformation.invoicePhoneNumber}</br>傳真:</br>
                        開戶銀行:${orderinformation.invoiceDepositBank}</br>賬號:${orderinformation.invoiceBankAccount} </td>
                </tr> 

想做成的效果

經過多次查找,發現沒什么問題;頁面也能正常的顯示,但就是會再轉pdf時報錯

最后無意間修改解決了問題

 <tr>
                    <td class="product_table_th">供方:四川xxxx有限公司<br></br>地址:xxxx開發區<br></br>電話:028-xxxx59<br></br>傳真:028-3xxxx09<br></br>
                        開戶銀行:中國xxx分行<br></br>賬號:5100 xxxxx 0200
                    </td>
                    <td class="product_table_th">需方:${orderinformation.invoiceCompanyName}<br></br>地址:${orderinformation.invoiceSite} <br></br>
                        電話:${orderinformation.invoicePhoneNumber}<br></br>傳真:<br></br>
                        開戶銀行:${orderinformation.invoiceDepositBank}<br></br>賬號:${orderinformation.invoiceBankAccount} </td>
                </tr>

重點為<br></br>  因為itex轉pdf是非常嚴謹的必須有開頭和結尾

 

2.org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). org.xml.sax.SAXParseException; lineNumber: 89; columnNumber: 45; 元素類型 "td" 必須后跟屬性規范 ">" 或 "/>"。

報錯代碼為

 <tr>
                    <td class="product_table_th">備注</td>
                    <td class="product_table_th"colspan="5"> ${orderinformation.customerRemark} </td>
                </tr>

原因居然是

這。。。尼....果然嚴謹

3.  本因分開的結果沒有分開對應顯示

錯誤代碼

    <#list orderContract as good>
                <thead align="center">
                    <tr>
                        <td class="product_table_th"><span>${good.goodsInfoName}</span></td>
                        <td class="product_table_th"><span>${good.goodsInfoNum}</span></td>
                        <td class="product_table_th"><span>件</span></td>
                        <td class="product_table_th"><span>${good.goodsInfoPrice}</span></td>
                        <td class="product_table_th"><span>${good.goodsInfoSumPrice}</span></td>
                    </tr>
                </thead>
                </#list>

原因:加入了<thead align="center">屬性,,,注釋掉就好

 4.只顯示數字和英文    ,  中文字符不顯示問題

在網上查了很多,各方面的問題解決方法都有

我的問題是

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>合同打印預覽</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
    <meta name="renderer" content="webkit"></meta>
</head>

<body style="font-size:12.0pt; font-family: SimSun; background: none;margin-left: auto;margin-right: auto">
<table.....>
...

主要是這個      <body style="font-size:12.0pt; font-family: SimSun; background: none;margin-left: auto;margin-right: auto">   加上就好了

 


免責聲明!

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



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