Java 如何在iText中定义图案颜色填充的偏移?

Java 如何在iText中定义图案颜色填充的偏移?,java,itext,Java,Itext,我试图将平铺对角线水印添加到pdf中,但iText中的填充图案似乎总是从页面的左下角平铺,这意味着页面顶部和右侧的平铺可以突然剪切是否有从左上角平铺的选项,或者有偏移的选项? 以下是代码示例: List<String> watermarkLines = getWatermarkLines(); Rectangle watermarkRect = getWatermarkRect(); PdfContentByte over = stamper.getOverContent(1);

我试图将平铺对角线水印添加到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();
List watermarkLines=getWatermarkLines();
矩形watermarkRect=getWatermarkRect();
PdfContentByte over=母版。getOverContent(1);
pdfpatternPainer painter=over.createPattern(watermarkRect.getWidth(),watermarkRect.getHeight();
对于(int x=0;x
我尝试将
矩形
函数的x和y值更改为负值或正值,但水印似乎仍然压印在图案中,就像它是从左下角平铺的一样,在与以前相同的位置进行剪切。

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

您可以这样创建模式

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");
}
静态仿射变换getWatermarkTransform(列出水印线,int x){
返回AffineTransform.getTranslateInstance(6+15*x,6);
}
静态矩形getWatermarkRect(){
返回新矩形(65,50);
}
静态列表getWatermarkLines(){
返回数组.asList(“测试行1”、“测试行2”);
}
您的原始代码为我创建了一个左上角,如下所示

PdfPatternPainter painter = over.createPattern(2 * watermarkRect.getWidth(), 2 * watermarkRect.getHeight(),
                                               watermarkRect.getWidth(), watermarkRect.getHeight());

上面偏移量的代码创建了这样一个

PdfPatternPainter painter = over.createPattern(2 * watermarkRect.getWidth(), 2 * watermarkRect.getHeight(),
                                               watermarkRect.getWidth(), watermarkRect.getHeight());

您使用哪个iText版本?我这里的版本要求在
ColumnText.showTextAligned
中使用
短语
而不是
字符串。我的答案对您有帮助吗?还是仍然存在问题?在前一种情况下,请接受答案(单击左上方的勾号),在后一种情况下,请告诉我们评论中的剩余问题,或者(如果涉及大量数据或格式化数据)在编辑您的问题时的剩余问题。很抱歉延迟回复:是的,第三个参数应该是
短语,而不是
字符串。您的答案非常有用。谢谢:)这正是我要找的!用于创建模式的
xstep
ystep
参数起到了作用。谢谢