在iText中以不同页面大小的pdf文件中插入水印时出现问题

时间:2010-12-04 11:28:14

标签: itext watermark

当我尝试在绝对位置添加图像作为水印而absoluteX = 10f且绝对y = rectangle.getLeft()+(rectangle.getWidth() - image.getPlainWidth());

对于某些页面尺寸,图像不会在absoluteX = 10f时添加,必须将其增加到300f或更多。如何正确获取左边的绝对位置。

1 个答案:

答案 0 :(得分:0)

您需要检查页面的裁剪框并相对于此定位文本。另请注意,左下角不必为0,0,页面可以旋转

我看过横向页面有三种生成方式:

11 “×8.5”

8.5x11 @ 90度 8.5x11 @ 270度

(幸运的是我从来没有见过11x8.5 @ 180,或者我可能不得不在一般原则上严厉伤害某人)

“肖像”页面几乎普遍生成为8.5“x11”(或任何您的测量值)。在我的>使用PDF的十年,我还没有看到旋转的肖像页面。合法,但很愚蠢。

因此,要获得正确的bbox并将文本旋转到位,您需要以下内容:

final double TOP_OFFSET = 10.0 + IMAGE_HEIGHT; // or whatever
final double RIGHT_OFFSET = 15.0 + IMAGE_WIDTH;

PdfReader reader = new PdfReader( path );
PdfStamper stamper = new PdfStamper( reader, outStream );

Rectangle cropBox = reader.getCropBox( 1 );
int rotation = reader.getPageRotation( 1 );
PdfContentByte content = stamper.getOverContent( 1 ); // first page

AffineTransform transform;
double xOffset, yOffset;
switch( rotation ) {
  case 0:
    xOffset = cropBox.getRight() - RIGHT_OFFSET;
    yOffset = cropBox.getTop() - TOP_OFFSET;
    transform = AffineTransform.getTranslateInstance( xOffset, yOffset );
    break;
  case 90:
    // some other transformations here
    break;
  case 180:
    // and here
    break;
  case 270:
    // and here.
    break;
};

content.transform( transform );
content.addImage( waterMarkImage );

stamper.close();

我经常发现我必须通过相当一点来打破页面大小,以便找出我的转换错误的地方。对媒体框上的每个边框说+1000(如果存在则裁剪)。

PdfDictionary pageDict = reader.getPageN(1);
PdfArray boxes[] = {pageDict.getAsArray( PdfName.MEDIABOX ), pageDict.getAsArray( PdfName.CROPBOX ) };
float mods[] = {-1000, -1000, 1000, 1000 }
for (int i = 0; i < boxes.length; ++i) {
  if (boxes[i] == null)
    continue; // crop boxes are optional
  for (int j = 0; j < 4; ++j) {
    PdfNumber curVal = boxes[i].getAsNumber(j);
    PdfNumber newVal = curVal.getFloat() + mods[j];
    boxes[i].set( j, newVal );
  }
}

现在,当你搞砸了你的变形时(我不可避免地会这样做),你将能够看到你搞砸了,并修复它。