Вам необходимо установить флажок обрезки страницы и расположить текст относительно этого.Также обратите внимание, что левый нижний угол не обязательно должен быть 0,0, и что страницы можно поворачивать .
Я видел, как альбомные страницы генерируются тремя способами:
11"x8,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 );
}
}
Теперь, когда вы облажаете свои преобразования (я неизбежно это делаю), вы сможете увидеть, КАК вы облажалисьи исправить это.