最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#利用itext實(shí)現(xiàn)PDF頁面處理與切分

 更新時(shí)間:2022年04月26日 13:54:46   作者:XSpringSun  
這篇文章主要介紹了如何在C#中使用itext做一個(gè)pdf的頁面大小一致性處理,然后再根據(jù)數(shù)據(jù)切分出需要的pdf,感興趣的小伙伴可以了解一下

一、itext

我要使用itext做一個(gè)pdf的頁面大小一致性處理,然后再根據(jù)數(shù)據(jù)切分出需要的pdf.

iText的官網(wǎng)有關(guān)于它的介紹, 然后在官網(wǎng)可以查找api文檔。

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

二、處理PDF頁面大小一致

由于原始PDF 是掃描圖片合成來的,有些頁面掃描的圖片規(guī)格不一致,導(dǎo)致pdf閱讀性很差。

對于這個(gè)pdf我進(jìn)行處理,首先是在nuget 里面搜索 itext 進(jìn)行安裝,使用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);

然后對頁面進(jìn)行縮放計(jì)算,我們新的PDF默認(rèn)設(shè)置成A3大小,通過計(jì)算原始頁面和新頁面寬高比例進(jìn)行縮放。

計(jì)算完成后,在新文檔中使用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();
                }
            }

        }

注意:對寫入流要進(jìn)行pdfWriter.Flush()將緩沖區(qū)數(shù)據(jù)寫入PDF后再關(guān)。

以上就是C#利用itext實(shí)現(xiàn)PDF頁面處理與切分的詳細(xì)內(nèi)容,更多關(guān)于C# PDF頁面處理 切分的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法

    C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#生成互不相同隨機(jī)數(shù)的實(shí)現(xiàn)方法,文中詳細(xì)描述了C#生成互不相同隨機(jī)數(shù)的各個(gè)步驟及所用到的函數(shù),非常具有借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C# 遍歷datatable字段名和value的案例

    C# 遍歷datatable字段名和value的案例

    這篇文章主要介紹了C# 遍歷datatable字段名和value的案例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C#中String類常用方法匯總

    C#中String類常用方法匯總

    這篇文章主要介紹了C#中String類常用方法,較為詳細(xì)的匯總了String類中的常用方法,對于深入掌握C#字符串操作有著很好的學(xué)習(xí)借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • c#中抽象類和接口的詳細(xì)介紹

    c#中抽象類和接口的詳細(xì)介紹

    這篇文章介紹了c#中抽象類和接口,有需要的朋友可以參考一下
    2013-10-10
  • 淺談C#多線程簡單例子講解

    淺談C#多線程簡單例子講解

    本篇文章主要介紹了C#多線程簡單例子,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • 基于C#實(shí)現(xiàn)文檔打印功能

    基于C#實(shí)現(xiàn)文檔打印功能

    在軟件開發(fā)過程中,文檔打印是一個(gè)常見的功能需求,本文將詳細(xì)介紹如何在C#中實(shí)現(xiàn)文檔打印,并通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定幫助,需要的朋友可以參考下
    2024-10-10
  • C#選擇排序法實(shí)例分析

    C#選擇排序法實(shí)例分析

    這篇文章主要介紹了C#選擇排序法,實(shí)例分析了C#排序算法的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C# 獲取硬盤號,CPU信息,加密解密技術(shù)的步驟

    C# 獲取硬盤號,CPU信息,加密解密技術(shù)的步驟

    這篇文章主要介紹了C# 獲取硬盤號,CPU信息,加密解密技術(shù)的步驟,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2021-01-01
  • C#對文件進(jìn)行批量重命名或者對某單個(gè)文件進(jìn)行改名的示例代碼

    C#對文件進(jìn)行批量重命名或者對某單個(gè)文件進(jìn)行改名的示例代碼

    這篇文章主要介紹了C#對文件進(jìn)行批量重命名或者對某個(gè)單獨(dú)的文件進(jìn)行改名的實(shí)現(xiàn)方法,文中有相關(guān)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-05-05
  • c#數(shù)學(xué)表示法(后綴表示法)詳解

    c#數(shù)學(xué)表示法(后綴表示法)詳解

    什么是后綴表達(dá)式,查了下原來是一種比較特殊的數(shù)學(xué)表達(dá)式,有三種表達(dá)式:前綴表達(dá)式、中綴表達(dá)式和后綴表達(dá)式,下面我們使用示例學(xué)習(xí)一下
    2014-01-01

最新評論

商都县| 永兴县| 广南县| 江西省| 本溪| 巴林右旗| 安远县| 屯留县| 宁波市| 怀远县| 民县| 买车| 分宜县| 丹江口市| 尚志市| 利川市| 宁津县| 南城县| 普兰店市| 绥棱县| 陆河县| 莆田市| 邢台县| 电白县| 当涂县| 棋牌| 赞皇县| 林周县| 静宁县| 鹤山市| 呼图壁县| 松滋市| 邳州市| 辉县市| 青阳县| 乳源| 牙克石市| 宁波市| 康定县| 定襄县| 贵港市|