国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

spring boot itextPdf根據模板生成pdf文件

fuyi501 / 1393人閱讀

摘要:在開發一些平臺中會遇到將數據庫中的數據渲染到模板文件中的場景,用完全動態生成文件的太過復雜,通過可以比較簡單的完成數據渲染工作模板的表單域數據需定義名稱獲取輸出流下載相關申請表下載設置響應設置響應文件名稱申請表設置文件名稱獲取輸出流

在開發一些平臺中會遇到將數據庫中的數據渲染到PDF模板文件中的場景,用itextPdf完全動態生成PDF文件的太過復雜,通過itextPdf/AcroFields可以比較簡單的完成PDF數據渲染工作(PDF模板的表單域數據需定義名稱)

Controller獲取HttpServletResponse 輸出流

package pdf.controller;

import com.itextpdf.text.DocumentException;
import service.PdfService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping(WebConstants.WEB_pdf + "/download")
@Api(description = "pdf下載相關", tags = "Pdf.download")
@NoAuth
public class PdfDownloadController {

    @Autowired
    private PdfService PdfService;
    
    @Value("${pdf.template.path}")
    private String templatePath ;

    @ApiOperation(value = "申請表下載")
    @RequestMapping(value = "/download/{id}", method = RequestMethod.GET)
    @ResponseBody 
    @NoLogin
    public void download(@PathVariable("id") Long id, HttpServletResponse response) throws IOException, DocumentException {
        
        //設置響應contenType
        response.setContentType("application/pdf");
        //設置響應文件名稱
        String fileName = new String("申請表.pdf".getBytes("UTF-8"),"iso-8859-1");
        //設置文件名稱
        response.setHeader("Content-Disposition", "attachment; filename="+fileName);
        //獲取輸出流
        OutputStream out = response.getOutputStream(); 
        PdfService.download(id, templatePath ,out);
    }
}

Service生成pdf數據響應輸出流

1.業務service-負責實現獲取pfd模板數據,數據庫數據,實現動態賦值生成PDF

package service.impl;

import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ResourceUtils;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

@Service
public class ApplyServiceImpl implements ApplyService {

    @Override
    public DetailDTO getDetail(Long id) {
       // 獲取業務數據
       return null;
    }
    
    @Override
    public Map getPdfMapping(DetailDTO dto) {
        // TODO Auto-generated method stub
        // 獲取pdf與數據庫的數據字段映射map
    }
    
    @Override
    public void download(Long id, String templatePath, OutputStream out) {
        // TODO Auto-generated method stub
        DetailDTO dto  =  getDetail(id);
        Map fieldMapping = getPdfMapping(dto);
        String filePath;
        byte[] pdfTemplate;
        ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream();
        try {
            //獲取模板文件路徑
            filePath = ResourceUtils.getURL(templatePath).getPath();
            //獲取模板文件字節數據
            pdfTemplate = IOUtils.toByteArray(new FileInputStream(filePath));
            //獲取渲染數據后pdf字節數組數據
            byte[] pdfByteArray = generatePdfByTemplate(pdfTemplate, fieldMapping);
            pdfOutputStream.write(pdfByteArray);
            pdfOutputStream.writeTo(out);
            pdfOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                pdfOutputStream.close();
                out.flush();  
                out.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }  
        }

    }

    @Override
    //itextPdf/AcroFields完成PDF數據渲染
    public byte[] generatePdfByTemplate(byte[] pdfTemplate, Map pdfParamMapping) {
        Assert.notNull(pdfTemplate, "template is null");
        if (pdfParamMapping == null || pdfParamMapping.isEmpty()) {
            throw new IllegalArgumentException("pdfParamMapping can"t be empty");
        }

        PdfReader pdfReader = null;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfStamper stamper = null;
        try {
            // 讀取pdf模板
            pdfReader = new PdfReader(pdfTemplate);
            stamper = new PdfStamper(pdfReader, baos);
            //獲取所有表單字段數據
            AcroFields form = stamper.getAcroFields();
            form.setGenerateAppearances(true);

            // 設置
            ArrayList fontList = new ArrayList<>();
            fontList.add(getMsyhBaseFont());
            form.setSubstitutionFonts(fontList);

            // 填充form
            for (String formKey : form.getFields().keySet()) {
                form.setField(formKey, pdfParamMapping.getOrDefault(formKey, StringUtils.EMPTY));
            }
            // 如果為false那么生成的PDF文件還能編輯,一定要設為true
            stamper.setFormFlattening(true);
            stamper.close();
            return baos.toByteArray();
        } catch (DocumentException | IOException e) {
            LOGGER.error(e.getMessage(), e);
        } finally {
            if (stamper != null) {
                try {
                    stamper.close();
                } catch (DocumentException | IOException e) {
                    LOGGER.error(e.getMessage(), e);
                }
            }
            if (pdfReader != null) {
                pdfReader.close();
            }

        }
        throw new SystemException("pdf generate failed");
    }

    /**
     * 默認字體
     *
     * @return
     */
    private BaseFont getDefaultBaseFont() throws IOException, DocumentException {
        return BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    }

    /**
     * 微軟宋體字體
     *
     * @return
     */
     //設定字體
    private BaseFont getMsyhBaseFont() throws IOException, DocumentException {
        try {
            return BaseFont.createFont("/msyh.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        } catch (DocumentException | IOException e) {
            LOGGER.error(e.getMessage(), e);
        }
        return getDefaultBaseFont();
    }
}

數據庫的數據到pdf字段的映射可以使用配置,建立數據字段映射表,通過反射
可以將數據庫數 據對象轉為map,再通過定義的靜態map映射表,將數據map轉
換為pdf表單數據map

    BeanUtils.bean2Map(bean);
    /**
     * JavaBean對象轉化成Map對象
     * @param javaBean
     * @return
     */
    public static Map bean2Map(Object javaBean) {
        Map map = new HashMap();

        try {
            // 獲取javaBean屬性
            BeanInfo beanInfo = Introspector.getBeanInfo(javaBean.getClass());

            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            if (propertyDescriptors != null && propertyDescriptors.length > 0) {
                String propertyName = null; // javaBean屬性名
                Object propertyValue = null; // javaBean屬性值
                for (PropertyDescriptor pd : propertyDescriptors) {
                    propertyName = pd.getName();
                    if (!propertyName.equals("class")) {
                        Method readMethod = pd.getReadMethod();
                        propertyValue = readMethod.invoke(javaBean, new Object[0]);
                        map.put(propertyName, propertyValue);
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
    
    字段映射配置
    public class PdfMapping {

        public final static Map BASE_INFO_MAPPING = new HashMap() {
           {
            put("name", "partyA");
            put("identity", "baseIdentity");

           }
        };
    }

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76930.html

相關文章

  • Spring Boot集成Freemarker和iText生成PDF文檔

    摘要:格式文檔導出,是信息系統中非常實用的一種功能,用于各種報表和文檔的到處。示例中,使用生成要導出的格式文檔,通過來實現文件下載。將轉換成文檔生成的代碼比較簡單,創建一個對象,然后會在指定的中輸入生成的文件。作用相當于在中使用進行配置。 showImg(https://segmentfault.com/img/remote/1460000008547574); PDF格式文檔導出,是信息系...

    liujs 評論0 收藏0
  • Spring Boot集成JasperReports生成PDF文檔

    摘要:由于工作需要,要實現后端根據模板動態填充數據生成文檔,通過技術選型,使用來設計模板,結合工具庫來調用渲染生成文檔。 由于工作需要,要實現后端根據模板動態填充數據生成PDF文檔,通過技術選型,使用Ireport5.6來設計模板,結合JasperReports5.6工具庫來調用渲染生成PDF文檔。本人文采欠缺,寫作能力差,下面粗略的介紹其使用步驟,若有不對的地方,望大家莫噴,謝謝! 一、使...

    Miracle 評論0 收藏0
  • java根據模板動態生成PDF

    摘要:一需求說明根據業務需要,需要在服務器端生成可動態配置的文檔,方便數據可視化查看。能配置動態的模板,正好解決了樣式動態渲染和排版問題。包負責模板之外的額外信息填寫,這里主要是頁眉頁腳的定制。包的畫圖工具包,目前只有一個線形圖。 一、需求說明:根據業務需要,需要在服務器端生成可動態配置的PDF文檔,方便數據可視化查看。 二、解決方案:iText+FreeMarker+JFreeChart生...

    liukai90 評論0 收藏0
  • java根據模板動態生成PDF

    摘要:一需求說明根據業務需要,需要在服務器端生成可動態配置的文檔,方便數據可視化查看。能配置動態的模板,正好解決了樣式動態渲染和排版問題。包負責模板之外的額外信息填寫,這里主要是頁眉頁腳的定制。包的畫圖工具包,目前只有一個線形圖。 一、需求說明:根據業務需要,需要在服務器端生成可動態配置的PDF文檔,方便數據可視化查看。 二、解決方案:iText+FreeMarker+JFreeChart生...

    layman 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<