CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

干货:Java轻松搞定word转pdf,替换占位符+个性水印-免费源码丞旭猿

背景介绍

在实际的项目当中,有很多这样的场景,管理后台上传word模板文件(如协议、合同、通知书等),需要通过代码实现,将业务数据写入到word文件的不同位置,然后生成pdf文件并上传到文件服务器,提供用户下载或者预览的功能。比如:用户在某平台借款,生成的借款协议。

插件下载与安装

本文主要使用Aspose.Words实现word转pdf,通过替换word中的占位符实现文件中数据的更新。更多功能可以参考Aspose官方网站。

  • 插件下载

链接:https://pan.baidu.com/s/1TbkczJNSN9X8LjV5L49ssw

提取码:vspw

官网下载地址:https://www.aspose.com/

  • 插件安装

下载的jar包,可以直接放到java项目当中,也可以上传到maven私服追加pom引用。

效果展示

  • 原word文件,有year、month、day、user_name四个占位符
  • 转换后的PDF文件,占位符信息已更新,并追加了水印

代码逻辑

importcom.aspose.words.Shape;importcom.aspose.words.*;importjava.awt.*;importjava.io.ByteArrayInputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.InputStream;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;/**
 *@authorluandy
 *@create2021/02/28 12:43
 */publicclassTestWordsToPdf{/** isMatchCase 是否区分大小写 */privatestaticfinalbooleanIS_MATCH_CASE_TRUE =true;/** isMatchWholeWord 是否全词匹配 */privatestaticfinalbooleanIS_MATCH_WHOLE_WORD_TRUE =false;/** 字体目录:mac系统,根据系统字体目录调整 */privatestaticfinalString FONT_FOLDER ="/System/Library/Fonts";/**
     * 测试方法
     *
     *@paramargs
     *@throwsException
     */publicstaticvoidmain(String[] args)throwsException{
        String wordPath ="/Users/luandy/Downloads/模板_V1.0.docx";
        String pdfPath ="/Users/luandy/Downloads/模板_V1.0."+ System.currentTimeMillis() +".pdf";

        ConcurrentHashMap dataMap =newConcurrentHashMap();
        dataMap.put("year","2021");
        dataMap.put("month","2");
        dataMap.put("day","28");
        dataMap.put("user_name","我是八零后琐话,欢迎您的关注");// word转换pdfdocToPdf(wordPath, pdfPath, dataMap);
    }/**
     * word转pdf主方法
     * 
     *@paramwordPath
     *@parampdfPath
     *@paramdataMap
     *@return*@throwsException
     */publicstaticbooleandocToPdf(String wordPath, String pdfPath, ConcurrentHashMap dataMap)throwsException{// 验证License 若不验证则转化出的pdf文档会有水印产生if(!isWordLicense()) {
            System.out.println("License验证不通过...");returnfalse;
        }
        File pdfFile =null;
        FileOutputStream pdfFos =null;try{longold = System.currentTimeMillis();// 新建一个pdf文档pdfFile =newFile(pdfPath);
            pdfFos =newFileOutputStream(pdfFile);// 将要被转化的word文档Document doc =newDocument(wordPath);// 字体设置FontSettings.setFontsFolder(FONT_FOLDER + File.separator,true);// Aspose.Words 使用Replace()对模板进行替换字符操作replaceWordsKey(doc, dataMap);// 为PDF追加水印insertWaterMarkText(doc,"八零后琐话");// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换doc.save(pdfFos, SaveFormat.PDF);longnow = System.currentTimeMillis();
            System.out.println("共耗时:"+ ((now - old) /1000.0) +"秒");
        }catch(Exception e) {
            System.out.println("Word 转 Pdf 失败..."+ e);// 为了不生成空文件,出现异常时,删除pdf文件,以便重新生成if(pdfFile !=null) {
                pdfFile.delete();
            }returnfalse;
        }finally{if(pdfFos !=null) {
                pdfFos.close();
            }
        }// 文件转换成功returntrue;
    }/**
     * 替换Word中的占位符
     *
     *@paramdoc
     *@paramdataMap
     *@throwsException
     */privatestaticvoidreplaceWordsKey(Document doc, ConcurrentHashMap dataMap)throwsException{for(Map.Entry entry : dataMap.entrySet()) {// 替换Word中的变量,longfor_year为word模板中的占位符,2021为替换的数据,isMatchCase 是否区分大小写,isMatchWholeWord 是否全词匹配doc.getRange().replace(entry.getKey(), entry.getValue(), IS_MATCH_CASE_TRUE, IS_MATCH_WHOLE_WORD_TRUE);
        }
    }/**
     * 验证aspose.word组件是否授权:无授权的文件有水印和试用标记
     *
     *@return*/privatestaticbooleanisWordLicense(){try{// 避免文件遗漏String licensexml ="\n"+"\n"+"\n"+"Aspose.Total for Java\n"+"Aspose.Words for Java\n"+"\n"+"Enterprise\n"+"20991231\n"+"20991231\n"+"23dcc79f-44ec-4a23-be3a-03c1632404e9\n"+"\n"+"\n"+"sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=\n"+"\n"+"";
            InputStream inputStream =newByteArrayInputStream(licensexml.getBytes());
            com.aspose.words.License license =newcom.aspose.words.License();
            license.setLicense(inputStream);
        }catch(Exception e) {
            System.out.println("License验证异常..."+ e);returnfalse;
        }returntrue;
    }/**
     * 为PDF添加水印
     *
     *@paramdoc
     *@paramwaterMarkText
     *@throwsException
     */privatestaticvoidinsertWaterMarkText(Document doc, String waterMarkText)throwsException{
        Shape watermark =newShape(doc, ShapeType.TEXT_PLAIN_TEXT);// 水印内容watermark.getTextPath().setText(waterMarkText);// 水印字体watermark.getTextPath().setFontFamily("宋体");// 水印宽度watermark.setWidth(600);// 水印高度watermark.setHeight(150);// 旋转水印watermark.setRotation(-60);// 水印颜色watermark.getFill().setColor(Color.lightGray);
        watermark.setStrokeColor(Color.lightGray);
        watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);
        watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);
        watermark.setWrapType(WrapType.NONE);
        watermark.setVerticalAlignment(VerticalAlignment.CENTER);
        watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);
        Paragraph watermarkPara =newParagraph(doc);
        watermarkPara.appendChild(watermark);for(Section sect : doc.getSections()) {
            insertWaterMarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
            insertWaterMarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
            insertWaterMarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
        }
    }privatestaticvoidinsertWaterMarkIntoHeader(Paragraph waterMarkPara, Section sect,intheaderType)throwsException{
        HeaderFooter header = sect.getHeadersFooters().getByHeaderFooterType(headerType);if(header ==null) {
            header =newHeaderFooter(sect.getDocument(), headerType);
            sect.getHeadersFooters().add(header);
        }
        header.appendChild(waterMarkPara.deepClone(true));
    }
}

声明:本文部分素材转载自互联网,如有侵权立即删除 。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容