Как повернуть водяной знак (текст) в PDF с помощью iText? - PullRequest
0 голосов
/ 10 октября 2018

Я использую iText для печати водяного знака (текст: «SuperEasy You Done») на файлах PDF, как описано в Как сделать водяные знаки PDF-файлами с помощью текста или изображений? ( TransparentWatermark2.java ). См. Исходный код проекта на GitHub .

Теперь пример PDF-файла, который я получаю, этот (остальная часть документа опущена):

enter image description here

Как видите, водяной знак расположен по центру и горизонтали.

Я бы хотел держать его по центру в середине страницы, но поверните ее на 45 градусов , чтобы она вращалась против часовой стрелки.Примерно так:

enter image description here

Это код для отметки водяного знака на заданном байтовом массиве (PDF-документы только для меняпрямо сейчас)

/**
 * Returns the same document with the watermark stamped on it.
 * @param documentBytes Byte array of the pdf which is going to be returned with the watermark
 * @return byte[] with the same byte array provided but now with the watermark stamped on it.
 * @throws IOException If any IO exception occurs while adding the watermark
 * @throws DocumentException If any DocumentException exception occurs while adding the watermark
 */
private byte[] getDocumentWithWaterMark(byte[] documentBytes) throws IOException, DocumentException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    // pdf
    PdfReader reader = new PdfReader(documentBytes);
    int n = reader.getNumberOfPages();
    PdfStamper stamper = new PdfStamper(reader, outputStream);
    // text watermark
    Font font = new Font(Font.HELVETICA, 60);
    Phrase phrase = new Phrase("SuperEasy You Done", font);
    // transparency
    PdfGState gs1 = new PdfGState();
    gs1.setFillOpacity(0.06f);
    // properties
    PdfContentByte over;
    Rectangle pagesize;
    float x, y;
    // loop over every page (in case more than one page)
    for (int i = 1; i <= n; i++) {
        pagesize = reader.getPageSizeWithRotation(i);
        x = (pagesize.getLeft() + pagesize.getRight()) / 2;
        y = (pagesize.getTop() + pagesize.getBottom()) / 2;
        over = stamper.getOverContent(i);
        over.saveState();
        over.setGState(gs1);
        // add text
        ColumnText.showTextAligned(over, Element.ALIGN_CENTER, phrase, x, y, 0);
        over.restoreState();
    }
    stamper.close();
    reader.close();
    return outputStream.toByteArray();
}

PS: я читал это, но это не помогло:

1 Ответ

0 голосов
/ 11 октября 2018

Вам просто нужно указать желаемый угол поворота в качестве 6-го параметра в этой строке :

ColumnText.showTextAligned(over, Element.ALIGN_CENTER, phrase, x, y, 0); // rotate 0 grades in this case

Если указанное значение положительное (> 0), вращение против часовой стрелки,в противном случае (<0) вращение происходит по часовой стрелке. </p>

В этом конкретном случае для поворота водяного знака на 45 градусов против часовой стрелки вам просто нужно написать предыдущую строку , например, :

ColumnText.showTextAligned(over, Element.ALIGN_CENTER, phrase, x, y, 45f); // 45f means rotate the watermark 45 degrees anticlockwise

Применяя этот же принцип, мы можем добиться любого поворота в любом направлении.


Вся документация находится здесь: https://developers.itextpdf.com/apis по ссылкам для версия 5 и версия 7 .

...