『QQ:1353814576』

FreeSpire.PDF 实现对pdf页面添加签名贴图以及页面文字内容读取


FreeSpire.PDF 实现对pdf页面添加签名贴图

2022年春节临放假前一天搭上任务项目赶工,原本有两个客户端分别为:我负责打印前端客户端(负责的一些文件接收以及打印逻辑验证处理 也是早前临时落到我身上的需求) (?′UωU*`悲)=ε3, 另外一个属于后端端是另外一个同事负责开发(用于最后PDF文件的打印和上传逻辑处理)问题就出在后端程序一直不稳定,一会打印不了一会崩溃 修复很多次但一直没完全解决.

由于赶上过年放假 一时半会联系不上同事 ,加上我被迫留杭了(疫情等级升级 如果早跑两天就回去了)为了春节期间消停点 只好自己上手,简单研究了下对方的程序 实际逻辑并不负杂,核心就是文件上传\打印\贴图(医生签名) 本想着直接pdf三方dll移植过来直接用 没想到拿过来并不能用 可能是我的程序.net版本较高 导致不兼容 (?′UωU*`悲)=ε3 最后选择了FreeSpire.PDF

选择下图中箭头标注的那个 上面两个是要收费的会有水印

FreeSpire.PDF 实现对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;
            }

 }