PDF java 添加水印问题

您好, 请问对于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页的文档,加水印花费了几秒。请问有没有快速点的方式?谢谢

@IhsanYang

感谢您与支持人员联系。

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

@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)

@IhsanYang

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

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

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

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

@IhsanYang

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

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

@IhsanYang

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

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

我们公司最近购买了aspose pdf java 也遇到同样的问题,在用加水印页码时,一个大概60页的文件需要4秒才能加完。希望能给出解决方案啊,我本人在用iText测试的时候,同样一个文件,加水印页码只需要1.5秒~~~~希望官方尽快解决,不然我们只有转向用iText Pdf了

2.pdf (4.4 MB)
这个是我用来测试的文件。
pdfDocument = new Document(srcFile);

		PageNumberStamp pageNumberStamp = new PageNumberStamp();
		pageNumberStamp.setBackground(false);
		pageNumberStamp.setFormat(" # ");
		pageNumberStamp.setBottomMargin(10);
		pageNumberStamp.setRightMargin(10);
		pageNumberStamp.setHorizontalAlignment(HorizontalAlignment.Right);
		pageNumberStamp.setVerticalAlignment(VerticalAlignment.Top);
		pageNumberStamp.setStartingNumber(startNum);
		pageNumberStamp.getTextState().setFont(FontRepository.findFont("Arial"));
		pageNumberStamp.getTextState().setFontSize(20.0F);
		pageNumberStamp.getTextState().setFontStyle(FontStyles.Bold);
		pageNumberStamp.getTextState().setFontStyle(FontStyles.Italic);
		pageNumberStamp.getTextState().setForegroundColor(com.aspose.pdf.Color.getBlack());
		for (int Page_counter = 1; Page_counter <= pdfDocument.getPages().size(); Page_counter++) {
			pdfDocument.getPages().get_Item(Page_counter).addStamp(pageNumberStamp);
		}
		pdfDocument.save(dest);

@ Farhan.Raza

@wangxl,

您能否详细说明您的问题以及指向该问题的屏幕截图。

Our company recently bought Aspose PDF Java and encountered the same problem. When using watermarked page numbers, it takes about 4 seconds to add a 60 page file. I hope you can give me a solution. When I test with iText, it only takes 1.5 seconds to add water to print the page number of the same file ~ ~ ~ ~ I hope the official can solve it as soon as possible, otherwise we have to switch to iText PDF

Here is my code

pdfDocument = new Document(srcFile);

		PageNumberStamp pageNumberStamp = new PageNumberStamp();
		pageNumberStamp.setBackground(false);
		pageNumberStamp.setFormat(" # ");
		pageNumberStamp.setBottomMargin(10);
		pageNumberStamp.setRightMargin(10);
		pageNumberStamp.setHorizontalAlignment(HorizontalAlignment.Right);
		pageNumberStamp.setVerticalAlignment(VerticalAlignment.Top);
		pageNumberStamp.setStartingNumber(startNum);
		pageNumberStamp.getTextState().setFont(FontRepository.findFont("Arial"));
		pageNumberStamp.getTextState().setFontSize(20.0F);
		pageNumberStamp.getTextState().setFontStyle(FontStyles.Bold);
		pageNumberStamp.getTextState().setFontStyle(FontStyles.Italic);
		pageNumberStamp.getTextState().setForegroundColor(com.aspose.pdf.Color.getBlack());
		for (int Page_counter = 1; Page_counter <= pdfDocument.getPages().size(); Page_counter++) {
			pdfDocument.getPages().get_Item(Page_counter).addStamp(pageNumberStamp);
		}
		pdfDocument.save(dest);

2.pdf (4.4 MB)

@wangxl,

I have tested your sample code along with source file and time which this process took, it seems reasonable to us. Also your source file contain lots of data along with charts so it is fine.

Hi Bro, 这个水印是基于page level的目前支持人员那边没有任何反馈,不过在使用时我们发现,aspose方法连续调用两次+的性能差别是很大的。例如:22页文档第一次水印花费4066ms, 第二次却只花费了231ms, 所以对aspose 进行 warm up 能有效缩短花费时间
test-watermark.png (30.2 KB)
watermark-cost-time.png (2.4 KB)

兄弟,我看不到你的附件,你说的这个 warm up怎么实现?

@IhsanYang 可以给我看看预热的代码?

@wangxl

我们已经在系统中创建了票证,以调查此过程是否有更快的方法。我们将尽快与您分享反馈。