Как повернуть изображение перед добавлением его в PDF? - PullRequest
2 голосов
/ 28 апреля 2020

Я пытаюсь добавить несколько случайных динамических c изображений водяных знаков на каждую страницу моего PDF. Эти сгенерированные изображения должны быть повернуты на 45 градусов. Когда я добавляю изображение в PDF, даже после указания поворота, изображение все равно выглядит плоским. Есть идеи, почему вращение не применяется? Я использую Itext7

iText.Kernel.Geom.Rectangle pagesize;
Image img = DrawText(watermark);
ImageData imageData = ImageDataFactory.CreatePng(ImageToByteArray(img));

float x, y;
// loop over every page
for (int i = 1; i <= n; i++)
{
    int watermarksPerPage = GetRandomNumber(1, MAX_WATERMARKS_PER_PAGE);
    PdfPage page = doc.GetPage(i);
    pagesize = page.GetPageSizeWithRotation();
    PdfCanvas canvas = new PdfCanvas(page);

    x = (pagesize.GetLeft() + pagesize.GetRight());
    y = (pagesize.GetRight() + pagesize.GetBottom());

    canvas.SetExtGState(gs1);

    int boundaryWidth = (int)(x * INVISIBLE_BOUNDARY_PERCENT);
    int boundaryHeight = (int)(y * INVISIBLE_BOUNDARY_PERCENT);

    for (int m = 0; m <= watermarksPerPage; m++)
    {
        //create an invisble boudary that the watermark should not cross using x% of width      
        float newx = GetRandomNumber(0, (int)x - boundaryHeight);
        float newy = GetRandomNumber(0, (int)y - boundaryWidth);
        imageData.SetRotation(ROTATION);
        canvas.AddImage(imageData, newx, newy, false);
    }
}

1 Ответ

0 голосов
/ 28 апреля 2020

ImageData.SetRotation не устанавливает значение поворота, используемое всякий раз, когда этот экземпляр ImageData визуализируется iText, оно просто перезаписывает метаданные изображения, указывающие, как изображение должно отображаться в вертикальном положении. Насколько я вижу, соответствующий GetRotation в настоящее время вообще не вызывается кодом iText, поэтому ваше значение поворота игнорируется.

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

canvas.SaveState();
canvas.ConcatMatrix(AffineTransform.GetRotateInstance(Math.PI / 4, x, y));
canvas.AddImage(imageData, x - imageData.GetWidth() / 2, y - imageData.GetHeight() / 2, false);
canvas.RestoreState();
...