首页 > 编程语言 >ASP.NET Core 给 PDF 加水印

ASP.NET Core 给 PDF 加水印

时间:2024-04-01 19:45:04浏览次数:20  
标签:Core ASP string using int itext new pdf NET

需要使用 itext-dotnet :https://github.com/itext/itext-dotnet


使用Nuget:

Install-Package itext

Install-Package itext.bouncy-castle-adapter


给 PDF 加水印

        public static bool WatermarkPdf(string inputPath,string outputPath, string watermarkImage, string watermarkTxt)
        {
            bool result = false;
            try
            {
                using (FileStream pdfStream = new FileStream(outputPath, FileMode.Create))
                {
                    using (PdfReader existingPdf = new PdfReader(inputPath))
                    {
                        using (PdfWriter newPdf = new PdfWriter(pdfStream))
                        {
                            using (PdfDocument pdfDocument = new PdfDocument(existingPdf, newPdf))
                            {
                                Document document = new Document(pdfDocument);
                                iText.Kernel.Geom.Rectangle pageSize;
                                PdfCanvas canvas;

                                var image = new iText.Layout.Element.Image(iText.IO.Image.ImageDataFactory.Create(watermarkImage)).ScaleToFit(200, 200);
                                PdfFont fonts= PdfFontFactory.CreateFont(StandardFonts.TIMES_ROMAN);


                                int red = 51;
                                int green = 53;
                                int blue = 102;

                                for (int i = 1; i <= pdfDocument.GetNumberOfPages(); i++)
                                {
                                    PdfPage page = pdfDocument.GetPage(i);
                                    pageSize = page.GetPageSize();
                                    canvas = new PdfCanvas(page);

                                    Paragraph p = new Paragraph();
                                    p.Add(image);
                                    p.SetFont(fonts);
                                    p.Add(new Text("\r\n"));
                                    p.Add(new Text(watermarkTxt).SetFontSize(90).SetFontColor(new DeviceRgb((float)red / 255f, (float)green / 255f, (float)blue / 255f)));
                                    p.Add(new Text("\r\n"));
                                    p.Add(new Text(DateTime.Now.ToString("yyyy-MM-dd HH:mm")).SetFontSize(60).SetFontColor(ColorConstants.DARK_GRAY));
                                    canvas.SaveState();
                                    PdfExtGState gs1 = new PdfExtGState().SetFillOpacity(0.4f);
                                    canvas.SetExtGState(gs1);
                                    document.ShowTextAligned(p, pageSize.GetWidth() / 2 - 50, pageSize.GetHeight() / 2 + 50, pdfDocument.GetPageNumber(page), TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
                                }

                                pdfDocument.Close();
                                newPdf.Close();
                                existingPdf.Close();
                                pdfStream.Close();
                            }
                        }
                    }
                }

                result = true;
            }
            catch (Exception e)
            {
                Console.WriteLine($"error:{e}");
            }
            return result;
        }



在控制器里调用下:

        public IActionResult Index()
        {
            bool result = PdfHelper.WatermarkPdf("F:\\pdf\\compressed.tracemonkey-pldi-09.pdf", "F:\\pdf\\compressed.tracemonkey-pldi-16.pdf", "F:\\pdf\\netcore.png", "Asp.Net Core 8.0");
            return Content(result.ToString());
        }


看下效果:

image



注意:默认字体的话,是不支持中文的,如果文字有中文,请引入支持中文的字体,比如:

PdfFont fontChinese;
var path = System.IO.Path.Combine("F:\\pdf", "font.ttf");
fontChinese = PdfFontFactory.CreateFont(path, PdfEncodings.IDENTITY_H);

标签:Core,ASP,string,using,int,itext,new,pdf,NET
From: https://www.cnblogs.com/sun8134/p/18109237

相关文章

  • 【PyTorch 实战2:UNet 分类模型】10min揭秘 UNet 分割网络如何工作以及pytorch代码实现
    UNet网络详解及PyTorch实现一、UNet网络原理  U-Net,自2015年诞生以来,便以其卓越的性能在生物医学图像分割领域崭露头角。作为FCN的一种变体,U-Net凭借其Encoder-Decoder的精巧结构,不仅在医学图像分析中大放异彩,更在卫星图像分割、工业瑕疵检测等多个领域展现出强大的应用......
  • 在.Net中操作redis
    在.Net中操作redis一、环境.Net7redis7.2.4二、所需类包StackExchange.Redis三、连接redis信息appsettings.json配置redis连接信息//Redis配置//"Redis":{//"Default":{//"Connection":"",//连接地址,端口号,密码//"Instance......
  • 云原生周刊:Kubernetes 1.30 的一切新功能 | 2024.4.1
    开源项目推荐Kubernetesschedulersimulator该项目是一个用于模拟Kubernetes调度器行为的开源项目,可用于测试和评估调度器的性能和行为。它提供了一个模拟集群和调度器的框架,并提供分析和可视化工具以帮助用户理解实验结果。OneChart该项目旨在简化应用程序的部署过程,通过......
  • Netty学习——源码篇9 Handler其他处理与异步处理
    1ChannelHandlerContext    每个ChannelHandler被添加到ChannelPipeline后,都会创建一个ChannelHandlerContext,并与ChannelHandler关联绑定。ChannelHandlerContext允许ChannelHandler与其他的ChannelHandler进行交互。ChannelHandlerContext不会改变添加到其中的Chan......
  • EF Core – 大杂烩
    前言记入一些零零碎碎的知识。 ShadowProperties参考:Docs– ShadowandIndexerPropertiesShadowProperty指的是那些在数据库有Column但是在EntityClass却没有Property的Property。举例publicclassProduct{publicintId{get;set;}publicstr......
  • Veritas NetBackup 10.4 (Unix, Linux, Windows) - 领先的企业备份解决方案
    VeritasNetBackup10.4(Unix,Linux,Windows)-领先的企业备份解决方案The#1enterprisebackupandrecoverysolution.请访问原文链接:https://sysin.org/blog/veritas-netbackup-10/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org备份和恢复软件解决方案领......
  • Microsoft.AspNetCore.SignalR.Client中传送用户Token
    Microsoft.AspNetCore.SignalR.Client的.Net客户端传送Token的最佳方法!如下将Authorization标头添加到HubConnectionBuilder中,如下所示:对于不记名令牌->HubConnection=newHubConnectionBuilder().WithUrl($"https://10.0.2.2:5001/chatHub",(opts)=>......
  • coredump文件的使用
    coredump文件在调试程序时,能够快速将堆栈恢复到程序崩溃时的状态,对于代码调试很有帮助,尤其是对于哪些难以复现的bug。在默认情况下,是不生成coredump文件的。可以通过命令ulimit-c查看当前系统允许生成coredump文件的大小。默认情况下,返回0,表示不允许生成coredump文件。通过命......
  • 基于energy score的out-of-distribution数据检测,LeCun都说好 | NerulPS 2020
     论文提出用于out-of-distributions输入检测的energy-based方案,通过非概率的energyscore区分in-distribution数据和out-of-distribution数据。不同于softmax置信度,energyscore能够对齐输入数据的密度,提升OOD检测的准确率,对算法的实际应用有很大的意义来源:晓飞的算法工程笔记......
  • Netty优化
    操作系统层面的优化提高文件描述符限制:在Linux系统中,每个进程都有打开文件描述符的数量限制。网络连接也使用这些文件描述符。确保这个限制足够高,以容纳所有的网络连接。可以使用ulimit-n命令来查看或设置这个限制。调整网络栈参数:考虑调整TCP/IP协议栈的相关参数,如最大套接......