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

前言:

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

附:https://reference.aspose.com/words/java/ 

第一步:

        引入依赖

        <dependency>
			<groupId>com.aspose</groupId>
			<artifactId>aspose-words</artifactId>
			<vresion>18.1</vresion>
		</dependency>

第二步:

        添加一个水印到文档中,并保存为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();
        }
    }

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

     /**
     * 插入水印
     * @param doc
     * @param watermarkText
     * @throws Exception
     */
    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);

        /*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" + text);*/
        for (Section section : doc.getSections()) {
            InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_PRIMARY);
            InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_FIRST);
            InsertWatermarkIntoHeader(watermarkPara, section, HeaderFooterType.HEADER_EVEN);
        }
    }
    /**
     * 将水印插入图像头部
     * @param watermarkPara
     * @param section
     * @param headerType
     */
    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));
    }

第三步:

        插入多个水印实现

     /**
     * 插入多个水印
     *
     * @param doc
     * @param waterMark
     * @throws Exception
     */
    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);
       /* Shape waterShape = ShapeMore(mdoc, wmText, 155, 300);
        watermarkPara.appendChild(waterShape);*/
        for (Section sect : doc.getSections()) {
            insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_PRIMARY);
            insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_FIRST);
            insertWatermarkIntoHeader(watermarkPara, sect, HeaderFooterType.HEADER_EVEN);
        }
    }

        多个水印处理

     /**
     * 设置水印属性
     *
     * @param doc
     * @param waterMark
     * @param left
     * @param top
     * @return
     * @throws Exception
     */
    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;
    }

效果展示:

        

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值