PDF java 添加水印问题


#1

您好, 请问对于PDF添加水印的方式,想要所有page都有水印,是不是只能遍历所有的page?就像下边这样:
for (int Page_counter = 1; Page_counter <= pdfDoc.getPages().size(); Page_counter++) {
Page page = pdfDoc.getPages().get_Item(Page_counter);
page.addStamp(textStamp);
page.addStamp(timeStamp);
}
目前这样做,一个22页的文档,加水印花费了几秒。请问有没有快速点的方式?谢谢


#2

@IhsanYang

感谢您与支持人员联系。

水印是使用标记(作为页面级对象)添加的,因此您需要逐页进行迭代。 如果发现速度很慢,请与我们分享您的源代码和生成的文档,以便我们进行进一步调查。


#3

@Farhan.Raza
好的。下边是一个22页空白测试文档和源代码。麻烦看下,还是说使用的方式有问题?谢谢
空白文档.pdf (32.1 KB)
水印生成文档.pdf (184.7 KB)

Summary

package com.cmb.lcidi.util;

import com.aspose.pdf.*;
import com.aspose.pdf.facades.FormattedText;
import org.apache.commons.lang3.StringUtils;
import org.junit.Assert;

import java.text.SimpleDateFormat;
import java.util.Date;

/**

  • @author Ihsan

  • @date 2019/10/29 10:18
    */
    public class PDFWaterMark {

    public static void main(String[] args) throws Exception {
    PDFWaterMark wm = new PDFWaterMark();
    Document pdfDoc = new Document(“src/test/resources/Files/空白文档.pdf”);
    long start = System.currentTimeMillis();
    boolean result = wm.pdfWaterMark(pdfDoc, “src/test/resources/Files/watermark.pdf”, “系统用户/00000001”);
    System.out.println("Cost time : " + (System.currentTimeMillis() - start));
    Assert.assertEquals(Boolean.TRUE, result);
    }

    public boolean pdfWaterMark(com.aspose.pdf.Document pdfDoc, String pdfSavePath, String waterMarkText) throws Exception {
    if (!AsposeLicenseUtil.setPdfLicense()) {
    return Boolean.FALSE;
    }

     TextStamp textStamp = getTextStamp(waterMarkText, 4.0F, 20.0F, 0,70.0D);
    
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     String currentTimeStr = format.format(new Date());
     TextStamp timeStamp = getTextStamp(currentTimeStr, 10.0F, 14.0F, 10.0D,60.0D);
     for (int Page_counter = 1; Page_counter <= pdfDoc.getPages().size(); Page_counter++) {
         Page page = pdfDoc.getPages().get_Item(Page_counter);
         page.addStamp(textStamp);
         page.addStamp(timeStamp);
     }
     pdfDoc.save(pdfSavePath);
     pdfDoc.dispose();
     return Boolean.TRUE;
    

    }

    private TextStamp getTextStamp(String waterMarkText, float lineSpacing, float fontSize, double xIndent, double yIndent) {
    FormattedText text = new FormattedText(waterMarkText);
    for (int i = 0; i < 7; i++) {
    text.addNewLineText(StringUtils.EMPTY, lineSpacing);
    text.addNewLineText(StringUtils.EMPTY, lineSpacing);
    text.addNewLineText(StringUtils.EMPTY, lineSpacing);
    text.addNewLineText(StringUtils.EMPTY, lineSpacing);
    text.addNewLineText(StringUtils.EMPTY, lineSpacing);
    text.addNewLineText(waterMarkText, lineSpacing);
    }
    TextStamp textStamp = new TextStamp(text);
    //标记为背景
    textStamp.setBackground(Boolean.FALSE);
    //旋转45度
    textStamp.setRotateAngle(45);
    textStamp.getTextState().setFont(new FontRepository().findFont(“Arial”));
    textStamp.getTextState().setFontSize(fontSize);
    textStamp.getTextState().setForegroundColor(Color.getLightGray());
    //不透明度
    // textStamp.setOpacity(0.5);
    textStamp.setHorizontalAlignment(HorizontalAlignment.Center);
    textStamp.setTextAlignment(TextAlignment.Center);
    textStamp.setXIndent(xIndent);
    textStamp.setYIndent(yIndent);
    return textStamp;
    }
    }

Summary

水印预期.png (40.2 KB)


#4

@IhsanYang

我们注意到,如果不旋转图章,则用户信息和时间将居中。

//旋转45度
//textStamp.setRotateAngle(45);

因此,我们记录了ID为PDFJAVA-38952的票证,以解决邮票旋转时的对齐问题。 一旦有任何有关此方面的更新,我们将通知您。


#5

@Farhan.Raza
好的,谢谢。
对于添加这种样式的水印,请问我这种使用方式有问题吗?
会有其他性能更优的办法吗?
谢谢。


#6

@IhsanYang

我们已经注意到您的担忧,并会在调查此情况后告知您是否有更好的解决方法。


#7

@Farhan.Raza
Hi, 请问关于 PDFJAVA-38952和性能这块有更新吗?谢谢


#8

@IhsanYang

请注意,该问题已记录在free support模式下,将以先到先得的方式进行调查。 因此,可能需要几个月才能解决。 一旦我们对票务解决方案进行了一些明确的更新,我们将立即通知您。

此外,我们还提供付费支持模式,其中问题可以紧急解决,并且优先于免费支持模式下记录的问题。 您可以检查我们的Paid Support选项以供参考。