如何为iText中的PatternColor填充定义偏移量?

时间:2018-07-10 02:55:07

标签: java itext

我正在尝试向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更改为负值或正值,但似乎水印仍在图案中加戳,就像从左下角开始平铺一样,将其切开。和以前一样。

1 个答案:

答案 0 :(得分:0)

首先,我无法确定您使用的是哪个iText版本

List<String> watermarkLines = getWatermarkLines();
...
ColumnText.showTextAligned(painter, 0, watermarkLines.get(x), (float) trans.getTranslateX(), (float) trans.getTranslateY(), 45f);

表示您使用的ColumnText.showTextAligned方法的第三个参数键入为StringObject。但是,我手头的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);

该样式应填充页面,就像从可见页面的左上角开始一样。

您尚未提供getWatermarkLinesgetWatermarkRectgetWatermarkTransform。如果我使用

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");
}

您的原始代码为我创建了这样的左上角

screen shot original

并且具有上述偏移量的代码创建了这样的代码

screen shot with offset