1. 程式人生 > 其它 >C# 操作PDF大全

C# 操作PDF大全

這裡分享的兩個類庫,各有特色。
Spire.Pdf 容易理解,使用方便,但效率比較低,操作PDF數量多,會佔用特別多記憶體,甚至記憶體溢位。
iTextSharp 不容易理解,尤其是新增書籤部分,但效率奇高,5000份單張PDF檔案同時合併、新增書籤用時2-3秒,記憶體在用少。

類庫 Spire.Pdf

1、書籤相關操作

書籤相關操作在這裡有詳細介紹,此處我留下連線並拿來主義,防止某天網頁無法訪問

概述:Spire.PDF 是一個專業的 PDF 元件,能夠獨立地建立、編寫、編輯、操作和閱讀 PDF 檔案,支援 .NET、Java、WPF 和 Silverlight。書籤不僅可以幫助我們跳轉到文件中相應的位置,還可以讓我們快速地瞭解文件所講述的內容。本文將介紹如何新增刪除 PDF 書籤,獲取多級書籤。

書籤不僅可以幫助我們跳轉到文件中相應的位置,還可以讓我們快速地瞭解文件所講述的內容。本文將介紹如何新增刪除 PDF 書籤,獲取多級書籤。


C# 獲取 PDF 多級書籤

Spire.PDF 不僅支援對簡單書籤的操作,還支援多級書籤。接下來將介紹如何使用 Spire.PDF 來獲取 PDF 文件中的多級書籤。

staticvoidMain(string[]args)
{
//載入含有多級書籤的PDF檔案
PdfDocumentdoc=newPdfDocument();
doc.LoadFromFile("示例.pdf");
//獲取文件的書籤
PdfBookmarkCollectionbookmarks=doc.Bookmarks;
//宣告一個可變字串
StringBuilderstringbuilder=newStringBuilder();
//獲取父書籤和子書籤
GetBookmarkTitle(bookmarks,stringbuilder);
//宣告txt檔案,並將獲得的多級書籤寫入到檔案.txt
StringfileName="D://檔案.txt";
File.WriteAllText(fileName,stringbuilder.ToString());
Console.ReadLine();
}
staticvoidGetBookmarkTitle(PdfBookmarkCollectionbookmarks,StringBuilderstringbuilder)
{
if(bookmarks.Count>0)
{
foreach(PdfBookmarkparentBookmarkinbookmarks)
{
stringbuilder.AppendLine(parentBookmark.Title);
//遞迴文件多級書籤
GetBookmarkTitle(parentBookmark,stringbuilder);
}
}
}

C# 新增、修改和刪除 PDF 書籤

新增書籤

在 Spire.PDF 中,每個 PDF 文件都有一個書籤列表(PdfBookmarkCollection)。我們可以通過 PdfDocument 物件的 Bookmarks 屬性來獲取該列表,然後通過 Add () 方法將書籤新增到列表中。

//新建PDF文件
PdfDocumentpdf=newPdfDocument();
//新增頁面
PdfPageBasepage=pdf.Pages.Add();

//新增書籤
PdfBookmarkbookmark=pdf.Bookmarks.Add("第一頁");

//設定書籤所指向的頁面和位置,(0,0)表示頁面的開始位置
bookmark.Destination=newPdfDestination(page);
bookmark.Destination.Location=newPointF(0,0);

//設定書籤的文字格式和顏色
bookmark.DisplayStyle=PdfTextStyle.Bold;
bookmark.Color=Color.Black;

//儲存文件
pdf.SaveToFile("Bookmark2.pdf");
新增子書籤
//新建PDF文件
PdfDocumentpdf=newPdfDocument();
//新增頁面
PdfPageBasepage=pdf.Pages.Add();

//新增書籤
PdfBookmarkbookmark=pdf.Bookmarks.Add("第一章熱傳導");

//設定書籤指向的頁面和位置
bookmark.Destination=newPdfDestination(page);
bookmark.Destination.Location=newPointF(0,0);

//設定書籤的文字格式和顏色
bookmark.DisplayStyle=PdfTextStyle.Bold;
bookmark.Color=Color.SeaGreen;

//新增子書籤
PdfBookmarkchildBookmark=bookmark.Insert(0,"1.1熱傳導基本知識");

//設定子書籤指向的頁面和位置
childBookmark.Destination=newPdfDestination(page);
childBookmark.Destination.Location=newPointF(400,300);

//設定子書籤的文字格式和顏色
childBookmark.DisplayStyle=PdfTextStyle.Regular;
childBookmark.Color=Color.Black;

//儲存文件
pdf.SaveToFile("ChildBookmark.pdf");
新增書籤到現有文件

除了在新建的 PDF 文件裡新增書籤,我們還可以給現有的 PDF 文件新增書籤。載入 PDF 文件的方法除 LoadFromFile 以外,還有 LoadFromStream (從流載入),LoadFromHTML(從 HTML 載入)等,可根據自己的需求選擇相應的載入方式。

//載入文件
PdfDocumentpdf=newPdfDocument();
pdf.LoadFromFile("示例.pdf");

for(inti=0;i<pdf.Pages.Count;i++)
{
//新增書籤
PdfBookmarkbookmark=pdf.Bookmarks.Add(string.Format("第{0}章",i+1));

//設定書籤指向的頁面和位置
bookmark.Destination=newPdfDestination(pdf.Pages[i]);
bookmark.Destination.Location=newPointF(0,0);

//設定書籤的文字格式和顏色
bookmark.DisplayStyle=PdfTextStyle.Bold;
bookmark.Color=Color.Black;
}
//儲存文件
pdf.SaveToFile("Bookmark2.pdf");
修改書籤

Spire.PDF 支援多種書籤修改方式,例如修改現有書籤的內容,插入新書籤到現有書籤列表,插入子書籤到現有書籤等。這裡我們選取修改書籤內容和插入新書籤到現有書籤列表進行介紹。

修改現有書籤內容

//載入文件
PdfDocumentpdf=newPdfDocument();
pdf.LoadFromFile("Bookmark2.pdf");

//獲取書籤列表
PdfBookmarkCollectionbookmarks=pdf.Bookmarks;

//獲取第一個書籤
PdfBookmarkbookmark=bookmarks[0];

//修改書籤指向的頁面
bookmark.Destination=newPdfDestination(document.Pages[1]);

//修改書籤的文字格式和顏色
bookmark.DisplayStyle=PdfTextStyle.Bold;
bookmark.Color=Color.Green;

//修改書籤的title
bookmark.Title="修改";

//儲存文件
pdf.SaveToFile("ModifyBookmark.pdf");
插入新書籤到現有書籤列表
//載入文件
PdfDocumentpdf=newPdfDocument();
pdf.LoadFromFile("Bookmark2.pdf");

//插入新書籤到指定位置
PdfBookmarkbookmark=pdf.Bookmarks.Insert(2,"新增第三章");

//設定書籤所指向的頁面和位置
bookmark.Destination=newPdfDestination(document.Pages[1]);
bookmark.Destination.Location=newPointF(0,300);

//儲存文件
pdf.SaveToFile("InsertBookmark.pdf");
刪除書籤

刪除書籤時,可以使用書籤的序號,也可以使用書籤的名稱。這裡所使用的是序號的方式。

//載入文件
PdfDocumentpdf=newPdfDocument();
pdf.LoadFromFile("Bookmark2.pdf");

//獲取所有書籤
PdfBookmarkCollectionbookmarks=document.Bookmarks;

//刪除第一個書籤
bookmarks.RemoveAt(0);

//儲存文件
pdf.SaveToFile("DeleteBookmark.pdf");

2、合併PDF相關操作

使用PdfDocument.MergeFiles(string[] filePath)

使用此方法合併PDF,如檔案數量過多,容易造成記憶體洩漏,程式碼量少易理解但效率較低

using Spire.Pdf;

PdfDocumentBase doc = PdfDocument.MergeFiles(pdfFiles); //pdfFiles是PDF檔案路徑組成的陣列
doc.Save(_fileSavePath + "\\單線圖合訂本.pdf"); //儲存文件
使用PdfDocument.InsertPage方法插入PDF的方法合併PDF並新增書籤

使用此方法合併PDF,如檔案數量過多,容易造成記憶體洩漏,程式碼量少易理解但效率較低

using Spire.Pdf;
using Spire.Pdf.Bookmarks;
using Spire.Pdf.General;

PdfDocument[] docs = new PdfDocument[pdfFiles.Length]; //pdfFiles是PDF檔案路徑組成的陣列
PdfDocument doc = new PdfDocument(); //新建合訂本PDF檔案
PdfPageBase page;
PdfBookmark bookmark;

for (int i = 0; i < pdfFiles.Length; i++)
{
    docs[i] = new PdfDocument(pdfFiles[i]);
    page = doc.InsertPage(docs[i], 0); //插入頁面,引數0代表將docs[i]的第一頁插入到doc中
    
    //在合併PDF的過程中同時為每頁新增書籤
    bookmark = doc.Bookmarks.Add(Path.GetFileNameWithoutExtension(pdfFiles[i])); //新增書籤
    //設定書籤所指向的頁面和位置,(0,0)表示頁面的開始位置
    bookmark.Destination = new PdfDestination(page);
    bookmark.Destination.Location = new PointF(0, 0);
    //設定書籤的文字格式和顏色
	bookmark.DisplayStyle = PdfTextStyle.Bold;
	bookmark.Color = Color.Black;
}

doc.SaveToFile(_fileSavePath + "\\單線圖合訂本.pdf"); //儲存文件

類庫 iTextSharp

1、合併PDF相關操作

效率非常高

using iTextSharp.text;
using iTextSharp.text.pdf;

using (var stream = new FileStream(_fileSavePath + "\\單線圖合訂本.pdf", FileMode.Create))
{
    using (Document doc = new Document())
    {
        using (var pdfCopy = new PdfCopy(doc, stream))
        {
            doc.Open();
            for (int i = 0; i < pdfFiles.Length; i++)
            {
                var reader = new PdfReader(pdfFiles[i]);
                var page = pdfCopy.GetImportedPage(reader, 1);
                pdfCopy.AddPage(page);
                pdfCopy.FreeReader(reader);
                reader.Close();
            }
        }
    }
}

2、合併PDF相關並建立書籤

由於是第一次使用ITextSharp類庫,理解還很淺薄,所以程式碼註釋比較簡單

當有不理解的地方時,可參考這裡這裡,下面的程式碼也是整合了這兩個連結的內容和第一部分合併PDF相關操作的內容

using iTextSharp.text;
using iTextSharp.text.pdf;

List<Dictionary<string, object>> bookmarks = new List<Dictionary<string, object>>();
using (var stream = new FileStream(_fileSavePath + "\\單線圖合訂本.pdf", FileMode.Create))
{
    using (Document doc = new Document())
    {
        using (var pdfCopy = new PdfCopy(doc, stream))
        {
            doc.Open();
            for (int i = 0; i < pdfFiles.Length; i++)
            {
                var reader = new PdfReader(pdfFiles[i]);
                var page = pdfCopy.GetImportedPage(reader, 1); //獲取第一頁
                pdfCopy.AddPage(page);

                var h = page.Height; //取第一頁高度
                var bookmark = new Dictionary<string,object>();
                bookmark.Add("Action", "GoTo");
                bookmark.Add("Title", Path.GetFileNameWithoutExtension(pdfFiles[i])); //標籤名稱
                //i + 1 + " XYZ 0 " + h + " 0" 定位代表第幾頁座標
                bookmark.Add("Page", i + 1 + " XYZ 0 " + h + " 0"); 

                bookmarks.Add(test);
                //pdfCopy.Outlines = (IList<Dictionary<string, object>>)bookmarks;
                pdfCopy.FreeReader(reader);
                reader.Close();
            }

            pdfCopy.Outlines = bookmarks; //為合訂本設定書籤
        }
    }
}

3、合併PDF(帶原PDF書籤)

下面方法是網上找到了,親測是可以使用的,除新增的備註未做任何修改,貼上來供參考理解

private void MergePdfFilesWithBookMark(string[] sourcePdfs, string outputPdf)
{
    PdfReader reader = null;
    Document document = new Document();
    PdfImportedPage page = null;
    PdfCopy pdfCpy = null;
    int n = 0;
    int totalPages = 0;
    int page_offset = 0;
    List<Dictionary<string, object>> bookmarks = new List<Dictionary<string, object>>();
    IList<Dictionary<string, object>> tempBookmarks;

    for (int i = 0; i <= sourcePdfs.GetUpperBound(0); i++)
    {
        reader = new PdfReader(sourcePdfs[i]);
        reader.ConsolidateNamedDestinations();
        n = reader.NumberOfPages;
        tempBookmarks = SimpleBookmark.GetBookmark(reader);
        
		//獲取原PDF的書籤並儲存到bookmarks中
        if (i == 0)
        {
            document = new iTextSharp.text.Document(reader.GetPageSizeWithRotation(1));
            pdfCpy = new PdfCopy(document, new FileStream(outputPdf, FileMode.Create));
            document.Open();
            SimpleBookmark.ShiftPageNumbers(tempBookmarks, page_offset, null);
            page_offset += n;
            if (tempBookmarks != null)
                bookmarks.AddRange(tempBookmarks);
            //  MessageBox.Show(n.ToString());
            totalPages = n;
        }
        else
        {
            SimpleBookmark.ShiftPageNumbers(tempBookmarks, page_offset, null);
            if (tempBookmarks != null)
                bookmarks.AddRange(tempBookmarks);

            page_offset += n;
            totalPages += n;
        }

        //合併PDF
        for (int j = 1; j <= n; j++)
        {
            page = pdfCpy.GetImportedPage(reader, j);
            pdfCpy.AddPage(page);
        }
        reader.Close();

    }
    pdfCpy.Outlines = bookmarks; /為合訂本設定書籤
    document.Close();
}
作者:dsmilely 來源:http://www.cnblogs.com/dsmilely/ Email:[email protected] 宣告:原創部落格請在轉載時註明“轉載”並保留原文連結或者在文章開頭加上本人部落格地址,如發現錯誤,歡迎批評指正。凡是轉載於本人的文章,不能設定打賞功能,如有特殊需求請與本人聯絡!