原文

本文使用 iTextSharp 5.5.13.2,记录使用 iTextSharp 提取图片时,获得的知识点

pdf 中的签名并不是单纯的一张图片,它是由一张基础的底色图和一张蒙版图片组成。需要提取底图和Mask。

下面是提取签名的底图和Mask的方法


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 = @"E:\1.pdf";
int count = 0; using (PdfReader sourceReader = new PdfReader(source))
{ AcroFields acroFields = sourceReader.AcroFields;
foreach (string name in acroFields.GetSignatureNames())
{
PdfStream xObject = (PdfStream)PdfReader.GetPdfObjectRelease(sourceReader.AcroFields.GetNormalAppearance(name));
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[0];
System.Drawing.Image drawingMask = strategy.Masks[0];
if (drawingImage != null)
{
drawingImage.Save(count++ + @".png");
}
if (drawingMask != null)
{
drawingMask.Save(count++ + @"Mask.png");
}
}
}

最新文章

  1. iOS判断程序在前台还是后台
  2. PHP MYSQL单向同步方案
  3. EF架构~LinqToEntity里实现left join的一对一与一对多
  4. Mac OS Storm+Kafka+Zookeeper配置
  5. MySQL rename database如何做?
  6. 最大熵的Java实现
  7. java面试笔试谈
  8. java 内部类的使用
  9. DB2_001_MQT
  10. Android 面试精华题目总结
  11. ARM-start.s注释(2410Init.s)
  12. 实战Asp.Net Core:部署应用
  13. mybatis 整合spring之mapperLocations配置的问题(转)
  14. 还在用慢的要死的百度网盘?来试试这款12.5M下载速度的免费网盘吧!
  15. You have more than one version of ‘org.apache.commons.logging.Log’ visible, which is not allowed问题解决
  16. [规则原则定理]规则原则定理章2ACID原则
  17. 1分钟,通过docker-compose 搭建zookeeper 集群
  18. C语言变长数组data[0]
  19. WCF客户端调用服务器端错误:&quot;服务器已拒绝客户端凭据&quot;。
  20. How to Auto Execute Commands/Scripts During Reboot or Startup.

热门文章

  1. 顺利通过EMC实验(18)
  2. 印度下架54款中国APP,中东政策逐年收紧,伊拉克成蓝海市场
  3. django开发前准备工作
  4. 将对象push到数组中组成对象数组
  5. LC-141andLC-142
  6. 讲解CPU之NUMA硬件体系以及机制(lscpu查看相关信息)
  7. SQLite 数据库使用记录
  8. STL空间分配器源码分析(二)mt_allocator
  9. mysql学习基础2
  10. 2021.08.06 P4392 Sound静音问题(ST表)