Проблема вставки водяного знака в файл PDF с изменяющимся размером страницы в iText - PullRequest
1 голос
/ 04 декабря 2010

Когда я пытаюсь добавить изображение в качестве водяного знака в абсолютной позиции, тогда как absoluteX = 10f и absolute y = rectangle.getLeft () + (rectangle.getWidth () - image.getPlainWidth ());

Для некоторых форматов страниц изображение не добавляется при абсолютной X = 10f, необходимо увеличить его до 300f или более. Как правильно получить абсолютную позицию слева.

1 Ответ

0 голосов
/ 06 декабря 2010

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

Теперь, когда вы облажаете свои преобразования (я неизбежно это делаю), вы сможете увидеть, КАК вы облажалисьи исправить это.

...