itextsharp 提取的签名图像崩溃
Signature image extracted by itextsharp is crashed
我从 pdf 中提取了一些盖章的签名图像(png 文件)。
其中很多是正常的,但 很少 个图像 已损坏 。
我能猜到一些原因:图像被加密了?使困惑?签名时
我是 itext 的新手,任何想法将不胜感激。
原因是您看到的图像是通过绘制大部分红色图像创建的
使用从另一幅图像派生的软蒙版
即软蒙版是白色的,图像中的红色是完全不透明的;在面具是黑色的地方,它是完全透明的,不可见的;遮罩中间有些灰色的地方,红色画得有点透明。
您在 is from 中使用的 ImageRenderListener
只提取基本图像,不提取遮罩。
您可以像这样改进它以提取与相应基础图像直接关联的软蒙版:
public class ExtImageRenderListener : IRenderListener
{
public List<System.Drawing.Image> Images = new List<System.Drawing.Image>();
public List<System.Drawing.Image> Masks = new List<System.Drawing.Image>();
public void BeginTextBlock()
{ }
public void EndTextBlock()
{ }
public void RenderText(TextRenderInfo renderInfo)
{ }
public void RenderImage(ImageRenderInfo renderInfo)
{
PdfImageObject imageObject = renderInfo.GetImage();
if (imageObject == null)
{
Console.WriteLine("Image {0} could not be read.", renderInfo.GetRef().Number);
}
else
{
Images.Add(imageObject.GetDrawingImage());
PRStream maskStream = (PRStream) imageObject.GetDictionary().GetAsStream(PdfName.SMASK);
if (maskStream != null)
{
PdfImageObject maskImageObject = new PdfImageObject(maskStream);
Masks.Add(maskImageObject.GetDrawingImage());
}
else
{
Masks.Add(null);
}
}
}
}
现在您可以同时处理图像和遮罩:
String source = @"stampForDebug.pdf";
String signatureFieldName = "Signature12";
using (PdfReader sourceReader = new PdfReader(source))
{
PdfStream xObject = (PdfStream)PdfReader.GetPdfObjectRelease(sourceReader.AcroFields.GetNormalAppearance(signatureFieldName));
PdfDictionary resources = xObject.GetAsDict(PdfName.RESOURCES);
ExtImageRenderListener strategy = new ExtImageRenderListener();
PdfContentStreamProcessor processor = new PdfContentStreamProcessor(strategy);
processor.ProcessContent(ContentByteUtils.GetContentBytesFromContentObject(xObject), resources);
System.Drawing.Image drawingImage = strategy.Images.First();
System.Drawing.Image drawingMask = strategy.Masks.First();
if (drawingImage != null)
{
drawingImage.Save(@"Signature12Image.png");
}
if (drawingMask != null)
{
drawingMask.Save(@"Signature12Mask.png");
}
}
我从 pdf 中提取了一些盖章的签名图像(png 文件)。
其中很多是正常的,但 很少 个图像 已损坏 。
我能猜到一些原因:图像被加密了?使困惑?签名时
我是 itext 的新手,任何想法将不胜感激。
原因是您看到的图像是通过绘制大部分红色图像创建的
使用从另一幅图像派生的软蒙版
即软蒙版是白色的,图像中的红色是完全不透明的;在面具是黑色的地方,它是完全透明的,不可见的;遮罩中间有些灰色的地方,红色画得有点透明。
您在 ImageRenderListener
只提取基本图像,不提取遮罩。
您可以像这样改进它以提取与相应基础图像直接关联的软蒙版:
public class ExtImageRenderListener : IRenderListener
{
public List<System.Drawing.Image> Images = new List<System.Drawing.Image>();
public List<System.Drawing.Image> Masks = new List<System.Drawing.Image>();
public void BeginTextBlock()
{ }
public void EndTextBlock()
{ }
public void RenderText(TextRenderInfo renderInfo)
{ }
public void RenderImage(ImageRenderInfo renderInfo)
{
PdfImageObject imageObject = renderInfo.GetImage();
if (imageObject == null)
{
Console.WriteLine("Image {0} could not be read.", renderInfo.GetRef().Number);
}
else
{
Images.Add(imageObject.GetDrawingImage());
PRStream maskStream = (PRStream) imageObject.GetDictionary().GetAsStream(PdfName.SMASK);
if (maskStream != null)
{
PdfImageObject maskImageObject = new PdfImageObject(maskStream);
Masks.Add(maskImageObject.GetDrawingImage());
}
else
{
Masks.Add(null);
}
}
}
}
现在您可以同时处理图像和遮罩:
String source = @"stampForDebug.pdf";
String signatureFieldName = "Signature12";
using (PdfReader sourceReader = new PdfReader(source))
{
PdfStream xObject = (PdfStream)PdfReader.GetPdfObjectRelease(sourceReader.AcroFields.GetNormalAppearance(signatureFieldName));
PdfDictionary resources = xObject.GetAsDict(PdfName.RESOURCES);
ExtImageRenderListener strategy = new ExtImageRenderListener();
PdfContentStreamProcessor processor = new PdfContentStreamProcessor(strategy);
processor.ProcessContent(ContentByteUtils.GetContentBytesFromContentObject(xObject), resources);
System.Drawing.Image drawingImage = strategy.Images.First();
System.Drawing.Image drawingMask = strategy.Masks.First();
if (drawingImage != null)
{
drawingImage.Save(@"Signature12Image.png");
}
if (drawingMask != null)
{
drawingMask.Save(@"Signature12Mask.png");
}
}