我正在尝试向pdf中添加平铺的对角水印,但是看来iText中的图案填充总是从页面的左下方开始平铺,这意味着可以剪切页面顶部和右侧的平铺突然。 是否可以选择从左上角平铺或使用偏移量?
以下是代码示例:
List<String> watermarkLines = getWatermarkLines();
Rectangle watermarkRect = getWatermarkRect();
PdfContentByte over = stamper.getOverContent(1);
PdfPatternPainter painter = over.createPattern(watermarkRect.getWidth(), watermarkRect.getHeight();
for (int x = 0; x < watermarkLines.size(); x++) {
AffineTransform trans = getWatermarkTransform(watermarkLines, x);
ColumnText.showTextAligned(painter, 0, watermarkLines.get(x), (float) trans.getTranslateX(), (float) trans.getTranslateY(), 45f);
}
over.setColorFill(new PatternColor(painter));
over.rectangle(0, 0, pageSize.getWidth(), pageSize.getHeight());
over.fill();
我尝试将rectangle
函数的x和y更改为负值或正值,但似乎水印仍在图案中加戳,就像从左下角开始平铺一样,将其切开。和以前一样。
答案 0 :(得分:0)
首先,我无法确定您使用的是哪个iText版本
List<String> watermarkLines = getWatermarkLines();
...
ColumnText.showTextAligned(painter, 0, watermarkLines.get(x), (float) trans.getTranslateX(), (float) trans.getTranslateY(), 45f);
表示您使用的ColumnText.showTextAligned
方法的第三个参数键入为String
或Object
。但是,我手头的iText 5版本在那里需要Phrase
。下面,我将展示如何在当前的iText 5.5.13中应用偏移量。您必须检查它是否也适用于您的版本。
是的,您可以在图案定义中应用偏移量!
如果不是
PdfPatternPainter painter = over.createPattern(watermarkRect.getWidth(), watermarkRect.getHeight());
您可以像这样创建图案
PdfPatternPainter painter = over.createPattern(2 * watermarkRect.getWidth(), 2 * watermarkRect.getHeight(),
watermarkRect.getWidth(), watermarkRect.getHeight());
您具有与图案应用程序(watermarkRect.getWidth(), watermarkRect.getHeight()
)相同的步长,但是使用画布的宽度是其宽度的两倍,高度是其文本位置的两倍。通过以偏移量放置文本,您可以有效地将整个图案移动该偏移量。
例如如果您将偏移量计算为
Rectangle pageSize = pdfReader.getCropBox(1);
float xOff = pageSize.getLeft();
float yOff = pageSize.getBottom() + ((int)pageSize.getHeight()) % ((int)watermarkRect.getHeight());
并使用
绘制文本ColumnText.showTextAligned(painter, 0, new Phrase(watermarkLines.get(x)), (float) trans.getTranslateX() + xOff, (float) trans.getTranslateY() + yOff, 45f);
该样式应填充页面,就像从可见页面的左上角开始一样。
您尚未提供getWatermarkLines
,getWatermarkRect
和getWatermarkTransform
。如果我使用
static AffineTransform getWatermarkTransform(List<String> watermarkLines, int x) {
return AffineTransform.getTranslateInstance(6 + 15*x, 6);
}
static Rectangle getWatermarkRect() {
return new Rectangle(65, 50);
}
static List<String> getWatermarkLines() {
return Arrays.asList("Test line 1", "Test line 2");
}
您的原始代码为我创建了这样的左上角
并且具有上述偏移量的代码创建了这样的代码