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
    评论
实现Java中的WordPDF水印功能,你可以使用freemaker对模板解析填充数据导出Word文档的功能,然后使用itext将Word转换PDF,最后使用itext对PDF添加水印。 以下是一个示例代码实现这个功能: ``` import com.aspose.words.Document; import com.aspose.words.SaveFormat; import com.aspose.words.Shape; import com.aspose.words.ShapeType; import java.io.FileOutputStream; public static void docToPdfWithWatermark(String inPath, String outPath, String imgUrl) { if (getLicense()) { try { FileOutputStream os = new FileOutputStream(new File(outPath)); Document doc = new Document(inPath); Shape shapeRectangle = new Shape(doc, ShapeType.RECTANGLE); doc.setBackgroundShape(shapeRectangle); // 添加水印图片 shapeRectangle.getImageData().setImage(imgUrl); // 降低对比度,增加亮度 shapeRectangle.getImageData().setContrast(0.2); shapeRectangle.getImageData().setBrightness(0.7); doc.save(os, SaveFormat.PDF); os.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 你可以参考上面的代码将输入路径(inPath)、输出路径(outPath)和水印图片路径(imgUrl)替换为你自己的路径。确保你已经获得了适用于Aspose Words的许可证。 为了实现这个功能,你需要引入Aspose Words的jar文件。你可以在这个链接中找到所需的jar文件:https://blog.csdn.net/qq_34315636/article/details/95358305 请注意,在实际使用中,你可能需要根据你的具体需求进行必要的调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值