FreeSpire.PDF 实现对pdf页面添加签名贴图以及页面文字内容读取
FreeSpire.PDF 实现对pdf页面添加签名贴图
2022年春节临放假前一天搭上任务项目赶工,原本有两个客户端分别为:我负责打印前端客户端(负责的一些文件接收以及打印逻辑验证处理 也是早前临时落到我身上的需求) (?′UωU*`悲)=ε3, 另外一个属于后端端是另外一个同事负责开发(用于最后PDF文件的打印和上传逻辑处理)问题就出在后端程序一直不稳定,一会打印不了一会崩溃 修复很多次但一直没完全解决.
由于赶上过年放假 一时半会联系不上同事 ,加上我被迫留杭了(疫情等级升级 如果早跑两天就回去了)为了春节期间消停点 只好自己上手,简单研究了下对方的程序 实际逻辑并不负杂,核心就是文件上传\打印\贴图(医生签名) 本想着直接pdf三方dll移植过来直接用 没想到拿过来并不能用 可能是我的程序.net版本较高 导致不兼容 (?′UωU*`悲)=ε3 最后选择了FreeSpire.PDF
选择下图中箭头标注的那个 上面两个是要收费的会有水印
以下是 FreeSpire.PDF对pdf页面签名贴图的实现代码
1. 定义一个签名贴图定位的参数类
public class DocterSignRect
{
public string Position { get; set; }
public int Zoom { get; set; }
public int X { get; set; }
public int Y { get; set; }
}
2. 贴图方法的实现
public MemoryStream SignReportPdf(FileStream fileStream, string docterName, DocterSignRect docterSign, out string textContent)
{
textContent = null;
try
{
string signPng = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Sign", $"{docterName}.png");
if (!System.IO.File.Exists(signPng))
{
Log4Net.Info($"报告签名文件不存在: {signPng}");
return null;
}
MemoryStream memoryStream = new MemoryStream();
using (FileStream signStream = new FileStream(signPng, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
Image sign = Bitmap.FromStream(signStream);
PdfDocument doc = new PdfDocument();
doc.LoadFromStream(fileStream);
PdfPageBase page = doc.Pages[0];
textContent = page.ExtractText();//解析PDF页面文本内容
double sign_h = page.ActualSize.Height * 1.0 / docterSign.Zoom;
double bfb = sign_h * 1.0 / sign.Height;
double sign_w = sign.Width * bfb;
double pos_top = page.ActualSize.Height - sign_h;
double pos_left = page.ActualSize.Width - sign_w;
PdfRubberStampAnnotation loStamp = new PdfRubberStampAnnotation(new RectangleF(new PointF(0, 0), new SizeF(page.ActualSize.Width, page.ActualSize.Height)));
PdfAppearance loApprearance = new PdfAppearance(loStamp);
PdfTemplate template = new PdfTemplate(page.ActualSize.Width, page.ActualSize.Height);
PdfImage image = PdfImage.FromImage(sign);
template.Graphics.DrawImage(image, (int)pos_left - docterSign.X, (int)pos_top - docterSign.Y, (int)sign_w, (int)sign_h);
loApprearance.Normal = template;
loStamp.Appearance = loApprearance;
page.AnnotationsWidget.Add(loStamp);
//string output = "e://3636.pdf";
//doc.SaveToFile(output);
doc.SaveToStream(memoryStream, FileFormat.PDF);
memoryStream.Flush();
memoryStream.Position = 0;
return memoryStream;
}
}
catch (Exception ex)
{
//Log4Net.Error("报告签失败", ex);
return null;
}
}