您好, 请问对于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页的文档,加水印花费了几秒。请问有没有快速点的方式?谢谢
@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)
我们注意到,如果不旋转图章,则用户信息和时间将居中。
//旋转45度
//textStamp.setRotateAngle(45);
因此,我们记录了ID为PDFJAVA-38952的票证,以解决邮票旋转时的对齐问题。 一旦有任何有关此方面的更新,我们将通知您。
请注意,该问题已记录在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);
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)
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怎么实现?