iText:PdfContentByte。矩形(矩形)的行为与预期不符

iText:PdfContentByte。矩形(矩形)的行为与预期不符,itext,Itext,我正在使用iText2.1.7,并试图在文档中绘制一个简单的矩形。下面的代码块按预期工作,并绘制一个覆盖整个页面(不包括页面边距)的矩形 Document Document=新文档(PageSize.A4.rotate()); PdfWriter writer=PdfWriter.getInstance(文档,outputStream); document.open(); PdfContentByte canvas=writer.getDirectContent(); 矩形pageDimensi

我正在使用iText2.1.7,并试图在文档中绘制一个简单的矩形。下面的代码块按预期工作,并绘制一个覆盖整个页面(不包括页面边距)的矩形

Document Document=新文档(PageSize.A4.rotate());
PdfWriter writer=PdfWriter.getInstance(文档,outputStream);
document.open();
PdfContentByte canvas=writer.getDirectContent();
矩形pageDimensions=writer.getPageSize();
canvas.saveState();
画布矩形(
pageDimensions.getLeft(边缘左侧),
pageDimensions.getBottom(marginBottom),
pageDimensions.getRight(边缘右侧),
pageDimensions.getTop(marginTop));
canvas.setColorStroke(颜色:黑色);
canvas.stroke();
canvas.restoreState();
document.close();
但是,如果我稍微更改画布代码块,以便在PdfContentByte之外定义矩形,那么我的代码将生成一个空白页面

。。。
矩形marginBox=新矩形(
pageDimensions.getLeft(边缘左侧),
pageDimensions.getBottom(marginBottom),
pageDimensions.getRight(边缘右侧),
pageDimensions.getTop(marginTop));
canvas.saveState();
canvas.长方形(marginBox);
canvas.setColorStroke(颜色:黑色);
canvas.stroke();
canvas.restoreState();
...

这不是
PdfContentByte.rectangle(rectangle)
方法的预期用途吗??理想情况下,我希望以一种不与directContent紧密耦合的方式定义矩形(以及它们的边框颜色和宽度),并且可以在以后自由地将它们添加到directContent中

首先,我觉得有必要说,您使用的是不应该再使用的iText版本。有关更多信息,请参阅

至于你的问题,你所做的一些假设是错误的。例如:当您使用
Rectangle
对象时,使用
stroke()
操作符是没有意义的,因为
Rectangle()
方法将
Rectangle
作为参数来绘制路径(与采用4个
float
值的方法相反)

如果没有为
矩形
定义边框和边框宽度,则采用
矩形的
rectangle()
方法将不会执行任何操作。换句话说,你需要这样的东西:

Rectangle rect = new Rectangle(36, 36, 559, 806);
rect.setBorder(Rectangle.BOX);
rect.setBorderWidth(2);
canvas.rectangle(rect);

如果没有定义边界,或者边界的宽度大于0,则假定没有边界。

谢谢您,Lowagie先生,非常感谢您抽出时间回答我的问题。即
rect.sebtorder(Rectangle.BOX)行是我试图使其工作的所有内容中缺少的组件。
Rectangle rect = new Rectangle(36, 36, 559, 806);
rect.setBorder(Rectangle.BOX);
rect.setBorderWidth(2);
canvas.rectangle(rect);