iText7:How 忽略 PDF 页面旋转

iText7:How to ignore PDF Page Rotation

我已经为这个问题苦苦挣扎了很长时间。我只是想使用 iText7.NET 实现标记功能。问题首先来自透明度。如果我使用图像(尝试使用透明 png),pdf 会被标记,但背景是黑色而不是透明的:

为了兴趣,关联代码如下:

Rectangle location = new Rectangle(crop.GetLeft(),crop.GetBottom(),iWidth/4,iHeight/4);

PdfStampAnnotation stamp = new PdfStampAnnotation(location).SetStampName(new PdfName("Logo"));

PdfFormXObject xObj = new PdfFormXObject(new Rectangle(iWidth, iHeight));
PdfCanvas canvas = new PdfCanvas(xObj, pdfDoc);
canvas.AddImage(img, 0, 0,iWidth, false);
stamp.SetNormalAppearance(xObj.GetPdfObject());

stamp.SetFlags(PdfAnnotation.PRINT);

pdfDoc.GetFirstPage().AddAnnotation(stamp);
pdfDoc.Close();

为了解决这个问题,我尝试效仿 Adob​​e 在图章插入方面所做的工作 - 将图章 PDF 合并 到现有文档中。事后看来,结果很棒,但事实证明,一旦您将 stamp 文档复制为 PdfFormXObject,合并过程就会考虑旋转——因此,一个 stamp 文档会发生具有非零旋转值(通常由于扫描)的方向错误(否则会由于纵横比翻转而过度拉伸)

相关代码如下所示:

// Document to be edited and documented to be merged in
PdfDocument newDoc = new PdfDocument(reader, writer);
PdfDocument srcDoc = new PdfDocument(new PdfReader(stampsrc));

// CropBox And Dimensions
Rectangle crop = newDoc.GetFirstPage().GetCropBox();
float width = crop.GetWidth();
float height = crop.GetHeight();

// Create FormXObject and Canvas
PdfFormXObject page = srcDoc.GetPage(1).CopyAsFormXObject(newDoc);
//Extract Page Dimensions
float xWidth = srcDoc.GetFirstPage().GetCropBox().GetWidth();
float xHeight = srcDoc.GetFirstPage().GetCropBox().GetHeight();

Rectangle location = new Rectangle(crop.GetLeft(), crop.GetBottom(), xWidth , xHeight );

Debug.WriteLine(location.GetWidth());

PdfStampAnnotation stamp = new PdfStampAnnotation(location).SetStampName(new PdfName("Logo"));
PdfCanvas canvas = new PdfCanvas(newDoc.GetFirstPage().NewContentStreamBefore(), newDoc.GetFirstPage().GetResources(), newDoc);

// canvas.AddXObject(page,location.GetLeft(),location.GetBottom(),page.GetWidth());
stamp.SetNormalAppearance(page.GetPdfObject());
stamp.SetFlags(PdfAnnotation.PRINT);
newDoc.GetFirstPage().AddAnnotation(stamp);

srcDoc.Close();
newDoc.Close();

另一种方法涉及使用 CopyPageTo 方法,但它没有理想的结果,因为我无法将它与图章相关联,也不包含透明度。因此,可以看出,我在尝试解决两个问题之一之间陷入困境。要么我设法找到一种方法使我的图像背景保持透明而不用担心旋转,要么只是抵消合并页面的旋转(更可取)。

此外,我一直在探索其他选项,例如使用 AffineTransformConcatMatrix 方法进行较低级别的操作 - 我不太精通在他们身上,但它似乎并不直接适用于我的冲压场景?我使用了值 (0 -1 1 0 1 1) 的 ConcatMatrix,认为对应于 90 度旋转,但我的图章就这样消失了。我相信最后一对数字是不正确的 - 但同样,那里没有完全理解,所以我不能提出索赔。

我尝试(但不是很清楚)的另一件事是弄乱任一文档的 setIgnorePageRotationForContent 方法,看看它是否影响放置。然而,将其设置为 true 或 false 并没有改变结果。

还有什么建议吗?这个问题真的像我说的那么难吗?我找不到任何直接解决此问题的在线讨论。

提前致谢

添加透明图像的代码完全有效,实际上应该适用于大多数 PNG 图像。

如果由于某种原因它不起作用,您可以通过以下方式明确设置图像遮罩:

// Circle mask
byte circledata[] = {(byte) 0x3c, (byte) 0x7e, (byte) 0xff,
            (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x7e,
            (byte) 0x3c};
ImageData mask = ImageDataFactory.Create(8, 8, 1, 1, circledata, null);
mask.MakeMask();
mask.SetInverted(true);
img.SetImageMask(mask);

PdfCanvas canvas = new PdfCanvas(xObj, pdfDoc);
canvas.AddImage(img, 0, 0, iWidth, false);

您还可以从磁盘加载遮罩。只需创建一个与图章原始图像尺寸相同的图像,并提供该蒙版图像的透明度级别。之后,您可以加载蒙版并将其设置为您的图像,方法与上述类似:

ImageData mask = ImageDataFactory.create(MASK_PATH);
mask.MakeMask();
img.SetImageMask(mask);

有关详细信息,另请参阅 this 示例。