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類庫,理解還很淺薄,所以程式碼註釋比較簡單
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]
宣告:原創部落格請在轉載時註明“轉載”並保留原文連結或者在文章開頭加上本人部落格地址,如發現錯誤,歡迎批評指正。凡是轉載於本人的文章,不能設定打賞功能,如有特殊需求請與本人聯絡!