Java根据模板生成PDF文件|添加盖章|添加水印
生活随笔
收集整理的這篇文章主要介紹了
Java根据模板生成PDF文件|添加盖章|添加水印
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
功能包括:
1. 根據(jù)HTML模板生成PDF文件
2. 對(duì)生成的PDF文件添加蓋章(指定位置放置圖片)
3. 對(duì)生成的PDF文件添加水印(指定位置放置文字)
1.引入PDF依賴&設(shè)置framework配置
<!--freemarker模板引擎--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <!--PDF相關(guān)--> <dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-core</artifactId><version>9.1.22</version> </dependency> <dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.1.22</version> </dependency> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version> </dependency> <!--application.yml--> freemarker:cache: falsesuffix: .htmlcharset: UTF-8template-loader-path: classpath:/templates/2.生成PDF文件|添加蓋章|添加水印
public class PdfTest {/*生成的PDF文件*/private static final String TARGET = "target.pdf";/*生成的印章文件*/private static final String STAMPER = "stamper_result.pdf";/*生成的水印文件*/public static final String WATERMARK = "watermark_result.pdf";/*印章圖片*/public static final String STAMPER_IMG = "stamper.png";public static void createPdf(String content) {try {ITextRenderer render = new ITextRenderer();ITextFontResolver fontResolver = render.getFontResolver();// 使用資源字體-宋體fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);// HTML內(nèi)容創(chuàng)建PDFrender.setDocumentFromString(content);render.layout();render.createPDF(new FileOutputStream(TARGET));} catch (Exception e) {e.printStackTrace();}}public void generateStamper() {try {PdfReader pdfReader = new PdfReader(new FileInputStream(TARGET));PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(STAMPER));Image image = Image.getInstance(STAMPER_IMG);PdfReaderContentParser parser = new PdfReaderContentParser(pdfReader);int pageSize = pdfReader.getNumberOfPages();KeywordListener keywordListener = new KeywordListener();keywordListener.setKeyWord("重復(fù)打印");ArrayList<KeywordListener.Coordinate> coordinateList = new ArrayList();for (int pageNumber = 1; pageNumber <= pageSize; pageNumber++) {// 獲取某頁(yè)的關(guān)鍵字位置keywordListener.init(pageNumber);parser.processContent(pageNumber, keywordListener);coordinateList.addAll(keywordListener.getCoordinates());}for (KeywordListener.Coordinate coordinate : coordinateList) {// 獲取操作的頁(yè)面PdfContentByte pdfContentByte = pdfStamper.getOverContent(coordinate.getPage());// 根據(jù)域的大小縮放圖片image.scaleAbsolute(80f, 80f);// 添加圖片image.setAbsolutePosition(coordinate.getX(), coordinate.getY());pdfContentByte.addImage(image);}pdfStamper.close();pdfReader.close();} catch (Exception e) {e.printStackTrace();}}public void generateWaterMark() {try {PdfReader pdfReader = new PdfReader(new FileInputStream(TARGET));PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(WATERMARK));// 原pdf文件的總頁(yè)數(shù)int pageSize = pdfReader.getNumberOfPages();// 設(shè)置字體BaseFont font = BaseFont.createFont("c:/WINDOWS/Fonts/simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);// 設(shè)置填充字體不透明度為0.2fPdfGState gs = new PdfGState();gs.setFillOpacity(0.2f);Document document = new Document();float documentWidth = document.getPageSize().getWidth(), documentHeight = document.getPageSize().getHeight();final float xStart = 0, yStart = 0, xInterval = 40, yInterval = 40, rotation = 45, fontSize = 18;String watermarkWord = "水印";int red = 128, green = 128, blue = 128;for (int i = 1; i <= pageSize; i++) {// 水印在之前文本下PdfContentByte pdfContentByte = pdfStamper.getUnderContent(i);pdfContentByte.beginText();// 文字水印 顏色pdfContentByte.setColorFill(new BaseColor(red, green, blue));// 文字水印 字體及字號(hào)pdfContentByte.setFontAndSize(font, fontSize);pdfContentByte.setGState(gs);// 文字水印 起始位置pdfContentByte.setTextMatrix(xStart, yStart);for (float x = xStart; x <= documentWidth + xInterval; x += xInterval) {for (float y = yStart; y <= documentHeight + yInterval; y += yInterval) {pdfContentByte.showTextAligned(Element.ALIGN_CENTER, watermarkWord, x, y, rotation);}}pdfContentByte.endText();}// 關(guān)閉pdfStamper.close();pdfReader.close();} catch (Exception e) {e.printStackTrace();}}}3.KeywordListener (在keyword處簽章)
public class KeywordListener implements RenderListener {private ArrayList<Coordinate> coordinates = new ArrayList<Coordinate>();private String keyWord;private int page;public void init(int pageNumber) {this.page = pageNumber;this.coordinates.clear();}public ArrayList<Coordinate> getCoordinates() {return coordinates;}public String getKeyWord() {return keyWord;}public void setKeyWord(String keyWord) {this.keyWord = keyWord;}public int getPage() {return page;}public void setPage(int page) {this.page = page;}@Overridepublic void beginTextBlock() {}@Overridepublic void endTextBlock() {}@Overridepublic void renderImage(ImageRenderInfo arg0) {}@Overridepublic void renderText(TextRenderInfo textRenderInfo) {String text = textRenderInfo.getText();if (null != text && text.contains(this.keyWord)) {Rectangle2D.Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange();Coordinate coordinate = new Coordinate();coordinate.setX(boundingRectange.x + 320);coordinate.setY(boundingRectange.y);coordinate.setPage(this.page);coordinates.add(coordinate);}}class Coordinate {public float x;public float y;public int page;public float getX() {return x;}public void setX(float x) {this.x = x;}public float getY() {return y;}public void setY(float y) {this.y = y;}public int getPage() {return page;}public void setPage(int page) {this.page = page;}} }4.pdfTemplate.html模板
<div><div><div style="text-align: center;"><span>重慶公司業(yè)務(wù)專用憑證</span></div><div style="text-align: center;margin-top: 10px;"><span>交易日期:${date?string("yyyy年MM月dd日")}</span></div></div><div><table align="center" border="1px" cellspacing="0"><tbody><tr><td rowspan="3" style="width: 12%;text-align: center;">付款人</td><td style="width:12%;text-align: center;">全稱</td><td colspan="5" width="76%">${payName}</td></tr><tr><td style="text-align: center;">賬號(hào)</td><td colspan="2">283012834413275198</td><td style="text-align: center;">開戶行號(hào)</td><td colspan="2">312975138452134</td></tr><tr><td style="text-align: center;">開戶行名稱</td><td colspan="5">重慶公司直屬支行</td></tr><tr><td rowspan="3" style="text-align: center;">收款人</td><td style="text-align: center;">全稱</td><td colspan="5">重慶深妹科技有限公司</td></tr><tr><td style="text-align: center;">賬號(hào)</td><td colspan="2">283012834413275198</td><td style="text-align: center;">開戶行號(hào)</td><td colspan="2">312975138452134</td></tr><tr><td style="text-align: center;">開戶行名稱</td><td colspan="5">重慶公司江北支行</td></tr><tr><td colspan="7"><span>幣種及金額(大寫):貳佰肆拾元整</span><br/><span style="margin-left: 70px;">(小寫):¥240.00</span></td></tr><tr><td style="text-align: center;">用途</td><td colspan="6">貨款</td></tr><tr><td style="text-align: center;">交易流水號(hào)</td><td colspan="3">0992827112211</td><td style="text-align: center;">手續(xù)費(fèi)</td><td colspan="2"></td></tr><tr><td style="text-align: center;">驗(yàn)證碼</td><td colspan="6">231234912375827348583435431</td></tr><tr><td style="height: 180px;text-align: center;">風(fēng)險(xiǎn)提示</td><td colspan="6"><ol><li>本回單不作為收款發(fā)貨依據(jù),請(qǐng)勿重復(fù)記賬;</li><li>本回單被偽造、變?cè)臁⒋鄹牡?#xff0c;不具有法律效力;</li><li>由于系統(tǒng)原因或通訊故障而導(dǎo)致的回單或?qū)~單與客戶實(shí)際交易不符的,<br/>以客戶實(shí)際交易為準(zhǔn);</li><li>每筆匯款流水號(hào)唯一,請(qǐng)仔細(xì)核對(duì),避免重復(fù)打印。</li></ol><div style="text-align: center;position: absolute;left: 50%;"><span>打印人員:01081111</span></div></td></tr></tbody></table></div> </div>5.UnitTest
@Autowired private FreeMarkerConfigurer freeMarkerConfigurer;@Test public void test() {Map<String, Object> data = new HashMap();data.put("date", new Date());data.put("payName", "稀男大學(xué)");PdfTest pdfTest = new PdfTest();StringBuffer sb = new StringBuffer();sb.append("<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"/><title>Title</title><style>body {font-family: SimSun;font-size: 14px;line-height: 150%;}td {height: 25px;}</style></head><body>\n");// 獲取模板,并設(shè)置編碼方式String templateHtml = null;try {Template template = freeMarkerConfigurer.getConfiguration().getTemplate("pdfTemplate.html");template.setOutputEncoding("UTF-8");templateHtml = FreeMarkerTemplateUtils.processTemplateIntoString(template, data);} catch (Exception e) {e.printStackTrace();}sb.append(templateHtml);sb.append(templateHtml);sb.append(templateHtml);sb.append("</body></html>");/*1.生成模板PDF文件*/pdfTest.createPdf(sb.toString());/*2.對(duì)生成的文件進(jìn)行印章*/pdfTest.generateStamper();/*3.對(duì)生成的文件添加水印*/pdfTest.generateWaterMark(); }6.說明
HTML模板文件的字體設(shè)置font-family:SimSun,"Times New Roman",Georgia,Serif; 每個(gè)值用逗號(hào)分開,如果字體名稱包含空格,它必須加上引號(hào),如果瀏覽器不支持第一個(gè)字體,則會(huì)嘗試下一個(gè) font-family:支持的字體包括:https://blog.csdn.net/WuLex/article/details/103044210總結(jié)
以上是生活随笔為你收集整理的Java根据模板生成PDF文件|添加盖章|添加水印的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017招商银行笔试01
- 下一篇: 如何把无限循环小数转换成分数形式