当我尝试在绝对位置添加图像作为水印而absoluteX = 10f且绝对y = rectangle.getLeft()+(rectangle.getWidth() - image.getPlainWidth());
对于某些页面尺寸,图像不会在absoluteX = 10f时添加,必须将其增加到300f或更多。如何正确获取左边的绝对位置。
答案 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 );
}
}
现在,当你搞砸了你的变形时(我不可避免地会这样做),你将能够看到你搞砸了,并修复它。