首页 > 编程语言 >C# iText 7 切分PDF,处理PDF页面大小,添加水印

C# iText 7 切分PDF,处理PDF页面大小,添加水印

时间:2022-11-14 14:12:27浏览次数:73  
标签:pdfWriter C# pdfDocument iText outPDfDoc new PDF null

C# iText 7 切分PDF,处理PDF页面大小,添加水印

 

一、itext

我要使用itext做一个pdf的页面大小一致性处理,然后再根据数据切分出需要的pdf.

iText的官网有关于它的介绍,https://itextpdf.com/ 然后在官网可以查找api文档https://api.itextpdf.com/。

其中我要使用的是itext7+,主要在iText.Kernel.Pdf 命名空间下。

二、处理PDF页面大小一致

由于原始PDF 是扫描图片合成来的,有些页面扫描的图片规格不一致,导致pdf阅读性很差。

对于这个pdf我进行处理,首先是在nuget 里面搜索 itext 进行安装,使用itext7。

处理PDF大小方法:

        public void RestPageSize(string sourcePdfPath, string outputPdfPath)
        {
            PdfReader pdfReader = null;
            PdfDocument pdfDocument = null;
            PdfWriter pdfWriter = null;
            PdfDocument outPDfDoc = null;
            try
            {
                pdfReader = new PdfReader(sourcePdfPath);
                pdfDocument = new PdfDocument(pdfReader);
                var outDir = System.IO.Path.GetDirectoryName(outputPdfPath);
                if (!Directory.Exists(outDir))
                {
                    Directory.CreateDirectory(outDir);
                }

                pdfWriter = new PdfWriter(outputPdfPath);
                outPDfDoc = new PdfDocument(pdfWriter);

                outPDfDoc.SetDefaultPageSize(PageSize.A3);


                for (int i = 1; i < pdfDocument.GetNumberOfPages() + 1; i++)
                {
                    var page = pdfDocument.GetPage(i);
                    var formXObject = page.CopyAsFormXObject(outPDfDoc);
                    var xPercent = PageSize.A3.GetWidth() / page.GetPageSize().GetWidth();
                    var yPercent = PageSize.A3.GetHeight() / page.GetPageSize().GetHeight();
                    PdfCanvas pdfCanvas = new PdfCanvas(outPDfDoc.AddNewPage());
                    pdfCanvas.AddXObjectWithTransformationMatrix(formXObject, xPercent, 0, 0, yPercent, 0, 0);
                }

                pdfWriter.Flush();

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            finally
            {
                if (pdfReader != null)
                {
                    pdfReader.Close();
                }
                if (pdfDocument != null)
                {
                    pdfDocument.Close();
                }
                if (outPDfDoc != null)
                {
                    outPDfDoc.Close();
                }
                if (pdfWriter != null)
                {
                    pdfWriter.Close();
                    pdfWriter.Dispose();
                }
            }

思路:遍历原来的PDF页码,将原来的PDF页码对象拷贝PdfFormXObject到要生成的PDF文档中,首先要copy页面对象才能使用,不然直接获取的page对象是原来文档的,我们无法操作。

var formXObject = page.CopyAsFormXObject(outPDfDoc);

然后对页面进行缩放计算,我们新的PDF默认设置成A3大小,通过计算原始页面和新页面宽高比例进行缩放。

计算完成后,在新文档中使用PdfCanvas 对象新添加一页,然后将PdfFormXObject 写入到新添加的页中。

处理后的PDF:

三、切分PDF

切分PDF 就比较简单了,直接从原始文件中拷贝页面到新PDF文档中就行了。

切分PDF 方法:

        public void ExtractPages(string sourcePdfPath, string outputPdfPath, int startPage, int endPage)
        {
            PdfReader pdfReader = null;
            PdfDocument pdfDocument = null;
            PdfWriter pdfWriter = null;
            PdfDocument outPDfDoc = null;
            try
            {
                pdfReader = new PdfReader(sourcePdfPath);
                pdfDocument = new PdfDocument(pdfReader);
                var outDir = Path.GetDirectoryName(outputPdfPath);
                if (!Directory.Exists(outDir))
                {
                    Directory.CreateDirectory(outDir);
                }
                
                pdfWriter = new PdfWriter(outputPdfPath);
                outPDfDoc = new PdfDocument(pdfWriter);

                pdfDocument.CopyPagesTo(startPage, endPage, outPDfDoc);
                pdfWriter.Flush();

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);

            }
            finally
            {
                if (pdfReader != null)
                {
                    pdfReader.Close();
                }
                if (pdfDocument != null)
                {
                    pdfDocument.Close();
                }
                if (outPDfDoc != null)
                {
                    outPDfDoc.Close();
                }

                if (pdfWriter != null)
                {
                    pdfWriter.Close();
                    pdfWriter.Dispose();
                }
            }

        }

注意:对写入流要进行pdfWriter.Flush()将缓冲区数据写入PDF后再关。

四、添加PDF图片水印

        public static void SetWatermark(string sourcePdfPath, string outputPdfPath)
        {
            PdfDocument pdfDoc = new PdfDocument(new PdfReader(sourcePdfPath), new PdfWriter(outputPdfPath));
            Document document = new Document(pdfDoc);
            PdfCanvas over;
            PdfExtGState gs1 = new PdfExtGState();
            //gs1.SetFillOpacity(0.6f);
            int n = pdfDoc.GetNumberOfPages();
            iText.Kernel.Geom.Rectangle pagesize;
            float x, y;
            //Bitmap image = new Bitmap("water.png");
            //image = ImageRotate(image, -45, Color.Transparent);
            var image = RotateImg(Image.FromFile("water.png"), -45);
            ImageData img = ImageDataFactory.Create(image, null);
            float w = img.GetWidth();
            float h = img.GetHeight();

            for (int i = 1; i <= n; i++)
            {
                PdfPage pdfPage = pdfDoc.GetPage(i);
                pagesize = pdfDoc.GetPage(i).GetPageSize();
                pdfPage.SetIgnorePageRotationForContent(true);

                x = (pagesize.GetLeft() + pagesize.GetRight()) / 2;
                y = (pagesize.GetTop() + pagesize.GetBottom()) / 2;
                over = new PdfCanvas(pdfDoc.GetPage(i));

                over.SaveState();
                over.SetExtGState(gs1);

                over.AddImageWithTransformationMatrix(img, w, 0, 0, h, x - (w / 2), y - (h / 2), true);
                over.RestoreState();
            }
            document.Close();
            pdfDoc.Close();
        }

作者:SunSpring

出处:https://www.cnblogs.com/SunSpring/p/16193835.html

本文版权归作者所有,欢迎转载,但未经作者同意需在文章页面明显位置给出原文链接。

     

标签:pdfWriter,C#,pdfDocument,iText,outPDfDoc,new,PDF,null
From: https://www.cnblogs.com/sexintercourse/p/16888871.html

相关文章

  • Failed to check the status of the service XXX.XXX. No provider available for the
    TheDubboConsumerCANNOTFIND service 1.检查消费者端配置version是否和提供者一致,有时候你消费者配置version="*"也是不行的2.检查group分组,如果有分组,则检查消......
  • Canal安装配置(消息队列类型:RabbitMQ)
    1.Mysql配置canal支持源端MySQL版本包括5.1.x,5.5.x,5.6.x,5.7.x,8.0.x1.1.查看mysqlbinlog是否开启:SHOWVARIABLESLIKE'log_bin' ON标识开启,如果m......
  • Oracle19c下载、安装及卸载
    1、官网下载地址:DatabaseSoftwareDownloads|Oracle  *安装zip文件,see all文件是对应客户端的下载位置(用于自学无需下载) 2、登陆Oracle账号,若无Oracle......
  • 2022 China Collegiate Programming Contest (CCPC) Weihai Site
    比赛链接:https://codeforces.com/gym/104023A.Dunai题意:\(n\)个队伍获得过冠军,告知每个队伍中的人及对应的位置,现在已知\(m\)个选手及它们的位置,问能组成多少个五......
  • C和C++的区别
    一、面向过程语言和面向对象语言C语言是面向过程语言,而C++是面向对象语言(一)面向过程和面向对象的区别(1)面向过程:面向过程编程就是分析出解决问题的步骤,然后把这些步骤一......
  • ASP.NET Core中选项的应用和总结
    在前面的文章中,我们介绍过将appsetting等配置文件映射到实体的的方式https://www.cnblogs.com/fei686868/p/16779249.html这里呢,我们介绍关于选项的另一种用法,就是通过IOp......
  • javascript对象和内置对象
    了解对象对象是什么?对象是一组无序的相关属性和方法集合,js中所有事物都是对象,例如字符串,数值,数组,函数等对象是由属性和方法组成的属性:事物的特征,在对象中用属性来表示(常......
  • C#写日志两个简单方法
    https://blog.csdn.net/hdhai9451/article/details/46455813https://www.cnblogs.com/wyt007/p/8023391.html在开发,有时为了验证程序运行是否正确,通常要写日志来记录操作......
  • TypeScript系列 -> 遇到报错 Cannot find name ‘console‘. Do you need to change y
    学习ts遇到的报错Cannotfindname‘console‘.Doyouneedtochangeyourtargetlibrary?gingthe‘lib‘compileroption解决办法:需要安装TypeScript助手的运......
  • B0::CTF小白热身赛round1 web writeup(部分)
    writeup仅代表个人理解,面向0基础小白,如有疏漏,敬请指正WEB你会百度吗(......