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

在iText中以不同页面大小在pdf文件中插入水印时出现问题,itext,watermark,Itext,Watermark,当我试图在绝对位置添加图像作为水印时,绝对X=10f,绝对y=rectangle.getLeft()+(rectangle.getWidth()-image.getPlainWidth()) 对于某些页面大小,图像在绝对值X=10f时无法添加,必须将其增加到300f或更高。如何正确获取左侧的绝对位置。您需要检查页面的裁剪框,并将文本相对于该框定位。还请注意,左下角不必为0,0,并且页面可以旋转 我看到景观页面以三种方式生成: 11“x8.5” 90度时为8.5x11 270度时为8.5x11 (

当我试图在绝对位置添加图像作为水印时,绝对X=10f,绝对y=rectangle.getLeft()+(rectangle.getWidth()-image.getPlainWidth())


对于某些页面大小,图像在绝对值X=10f时无法添加,必须将其增加到300f或更高。如何正确获取左侧的绝对位置。

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

我看到景观页面以三种方式生成:

11“x8.5”

90度时为8.5x11 270度时为8.5x11

(幸运的是,我从未见过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-box[]={pageDict.getAsArray(PdfName.MEDIABOX),pageDict.getAsArray(PdfName.CROPBOX)};
float mods[]={-1000,-1000,1000,1000}
对于(int i=0;i

现在,当你搞砸了你的转换(我不可避免地搞砸了),你将能够看到你是如何搞砸的,并修复它。

问题出在什么页面大小上?
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 );
  }
}