栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java实现word转换pdf并批量生成水印

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java实现word转换pdf并批量生成水印

前言:

        最近需要一个功能,将word文件转换为pdf格式,并在中间加入水印信息,因aspose.word源码是加密的,看起来比较费劲,官方api也是不很友好,故特此记录。

附:https://reference.aspose.com/words/java/ 官方api

第一步:

        引入依赖

        
			com.aspose
			aspose-words
			18.1
		

第二步:

        添加一个水印到文档中,并保存为pdf格式

    @Test
    public void testWord2PdfWithWaterMark() throws FileNotFoundException {
        File file = new File("C:\Users\dell\Desktop\aaa.docx");
        String targetPath = "C:\Users\dell\Desktop\test";
        File targetFile = new File(targetPath);
        if (!targetFile.exists()) {
            targetFile.mkdir();
        }
        FileOutputStream outputStream = new FileOutputStream(targetPath + File.separator + "bbb.docx");
        try (FileInputStream inputStream = new FileInputStream(file)) {
            Document doc = new Document(inputStream);
            InsertWatermarkText(doc, "你好啊");
            //InsertWaterMarks(doc, "你好啊");
            doc.save(outputStream, SaveFormat.DOCX);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

        截下来就是具体的实现了:

     
    private static void InsertWatermarkText(Document doc, String watermarkText) throws Exception {
        Shape watermark = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
        watermark.getTextPath().setText(watermarkText);

        //设置水印样式
        watermark.getTextPath().setFontFamily("Arial");//设置字体
        watermark.setRotation(-40);//设置偏移角度
        watermark.setHeight(100);//水印高度
        watermark.setWidth(200);//水印宽度
        watermark.setFillColor(Color.gray);//设置填充颜色
        watermark.setStrokeColor(Color.gray);//设置描边颜色

        //官方api给的解释  太官方了  (只插入一条水印 默认为这些数据)
        watermark.setRelativeHorizontalPosition(RelativeHorizontalPosition.PAGE);//指定相对于水平放置的位置
        watermark.setRelativeVerticalPosition(RelativeVerticalPosition.PAGE);//指定相对于形状垂直定位的位置

        watermark.setWrapType(WrapType.TOP_BOTTOM);//定义水印的环绕模式
        watermark.setVerticalAlignment(VerticalAlignment.CENTER);//  指定形状垂直放置的方式
        watermark.setHorizontalAlignment(HorizontalAlignment.CENTER);// 指定形状如何水平放置


        Paragraph watermarkPara = new Paragraph(doc);
        watermarkPara.appendChild(watermark);

        
        for (Section section : doc.getSections()) {
            InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_PRIMARY);
            InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_FIRST);
            InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_EVEN);
        }
    }
    
    private static void InsertWatermarkIntoHeader(Paragraph watermarkPara, Section section, int headerType) {
        HeaderFooterCollection headerFooters = section.getHeadersFooters();
        HeaderFooter footer = headerFooters.getByHeaderFooterType(headerType);
        if (footer == null) {
            footer = new HeaderFooter(section.getDocument(), headerType);
            section.getHeadersFooters().add(footer);
        }
        footer.appendChild(watermarkPara.deepClone(true));
    }

第三步:

        插入多个水印实现

     
    public static void InsertWaterMarks(Document doc, String waterMark) throws Exception {
        Paragraph watermarkPara = new Paragraph(doc);
        for (int j = 0; j < 500; j = j + 100) {
            for (int i = 0; i < 700; i = i + 85) {
                Shape waterShape = ShapeMore(doc, "—"+waterMark + "—", j, i);
                watermarkPara.appendChild(waterShape);
            }
        }
        String text = watermarkPara.getText();
        System.out.println("++++++++++" + text);
        System.out.println("______________" + watermarkPara);
        NodeCollection childNodes = watermarkPara.getChildNodes();
        String text1 = childNodes.get(0).getText();
        System.out.println("111111" + text1);
       
        for (Section sect : doc.getSections()) {
            insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
            insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
            insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
        }
    }

        多个水印处理

     
    public static Shape ShapeMore(Document doc, String waterMark, double left, double top) throws Exception {
        Shape waterShape = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);
//        Shape waterShape = new Shape(doc, ShapeType.TEXT_PLAIN_TEXT);

//        Shape waterShape = new Shape(doc, ShapeType.IMAGE);
//        waterShape.getImageData().setImage(wmText);
        waterShape.getTextPath().setText(waterMark);
        waterShape.getTextPath().setFontFamily("Arial");
        waterShape.setWidth(40);
        waterShape.setHeight(13);
        waterShape.setRotation(-40);
        waterShape.setFilled(true);


        waterShape.getFill().setColor(Color.RED);
        waterShape.setStrokeColor(Color.RED);
//        waterShape.setStrokeColor(new Color(210,210,210));
        //将水印放置在页面中心
        waterShape.setLeft(left);
        waterShape.setTop(top);
//        //设置垂直对齐
//        waterShape.setVerticalAlignment(VerticalAlignment.CENTER);
//        //设置文本水平对齐方式
//        waterShape.setHorizontalAlignment(HorizontalAlignment.CENTER);
        //设置包装类型
        waterShape.setWrapType(WrapType.NONE);
        return waterShape;
    }

效果展示:

        

具体样式可以自己调,比如颜色字体,水印一行个数,水印环绕格式等

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992778.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号