如何在将图像添加到 PDF 之前旋转图像?
How can I rotate an image before adding it to a PDF?
我正在尝试向我的 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);
}
}
ImageData.SetRotation
不会设置每当 iText 呈现此 ImageData
实例时使用的旋转值,它只是覆盖图像的元数据,指示应如何呈现图像以显示直立。据我所知,iText代码目前根本没有调用相应的GetRotation
,所以你的旋转值被忽略了。
因此,无需设置该图像数据旋转值,只需在插入图像之前旋转 canvas,例如像这样:
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();
我正在尝试向我的 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);
}
}
ImageData.SetRotation
不会设置每当 iText 呈现此 ImageData
实例时使用的旋转值,它只是覆盖图像的元数据,指示应如何呈现图像以显示直立。据我所知,iText代码目前根本没有调用相应的GetRotation
,所以你的旋转值被忽略了。
因此,无需设置该图像数据旋转值,只需在插入图像之前旋转 canvas,例如像这样:
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();