2017-03-15 238 views
1

我一直在努力解决这个问题很长一段时间了。我只是试图使用iText7.NET实现冲压功能。这个问题首先来自透明度。如果我使用的图像(透明的PNG试了一下),PDF格式被盖章,但背景是黑色而不是作为透明:iText7:如何忽略PDF页面旋转

enter image description here

感兴趣的缘故,相关的代码是以下:

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(); 

在努力解决这个问题,我试图效仿的Adobe确实与邮票插入 - 合并邮票PDF插入现有文档。事后看来结果很好,但事实证明,一旦您将戳记文档复制为PdfFormXObject,合并过程将旋转考虑在内 - 作为结果,恰好具有非零旋转值的戳记文档(通常为由于扫描)以错误的方向被定向(或以其它方式将得到超负荷由于翻转纵横比)

enter image description here

相关的代码如下所示:

// 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方法 - 我不能很好地在他们熟悉的是,但它似乎是不能直接适用于我的冲压场景?我用ConcatMatrix的值(0-1 1 0 1 1)认为它对应于90度旋转,但是我的邮票完全消失了。我相信最后一对数字是不正确的 - 但是,再次,在那里没有完整的理解,所以我不能提出索赔。

我尝试过的另一件事(但没有清楚地理解)与setIgnorePageRotationForContent方法混淆,以查看文档是否影响展示位置。然而,将它设置为true或false并不会改变结果。

有没有进一步的建议?这个问题真的和我发音一样困难吗?我找不到直接解决这个问题的在线讨论。

在此先感谢

+0

您可以分享您尝试使用第一种方法的图像吗?这个方法在一般情况下是正确的,至少对于[this](http://hydra-media.cursecdn.com/minecraft.gamepedia.com/8/85/Fizyplankton.png)图片来说,它是适用的。 –

+0

@AlexeySubach我做了......正如我所描述的,我的问题不是旋转,而是透明度。该图像不包含旋转信息,因此不会像预期的那样贴上邮票,但背景变为黑色,以便我尝试变成透明的图像(如上面的第一张图所示)。 –

+0

我明白了。我的意思是我所引用的图像是一张具有透明度的图像,并且如预期的那样没有黑色。 –

回答

1

添加透明图像的代码是完全合法的,实际上应该为大多数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样本的更多细节。