如果你已經完成 PDF 解析,本篇將針對程式碼進行詳細說明,解析 C# PDF 資料擷取的流程與邏輯,幫助你深入理解實作方式,並能應用在不同類型的文件處理場景中。
開始範例程式碼解析
1 . 開啟 C# PDF 解析教學|使用 PdfPig 擷取文件內容(完整範例)|C# PDF 系列 建立的程式

2 . 程式碼研究
我們找到button1按下會執行的程式碼,開始一行一行解讀。
private void button1_Click(object sender, EventArgs e)
{
string pdfPath = @"C:\MailAttachments\範例.pdf";
StringBuilder sb = new StringBuilder();
using (PdfDocument document = PdfDocument.Open(pdfPath))
{
foreach (UglyToad.PdfPig.Content.Page page in document.GetPages())
{
sb.Append(page.Text);
}
}
string text = sb.ToString();
Match m = Regex.Match(text, @"金\s*額\s*[::]\s*([0-9,\.]+)");
if (m.Success)
{
string amount = m.Groups[1].Value;
MessageBox.Show("金額 = " + amount);
}
else
{
MessageBox.Show("找不到金額");
}
}
程式碼片段:
- string pdfPath = @"C:\MailAttachments\範例.pdf";
- StringBuilder sb = new StringBuilder();
-------------------------------------------------------------------------------------------------------
第 1 行 因為我們一路從開始到現在已經是第六篇文章,我們已經開始是個初階工程師,所以我們也要開始學著用工程師的語言解釋。這裡是宣告一個string(字串型態)的變數pdfPath,並且把檔案的路徑存在這個變數裡面,等一下就能用這個變數找到檔案位置。
第 2 行 StringBuilder是一個.net 內建的型態,可以用來處理字串的串接。
並且,StringBuilder sb = new StringBuilder(); ,這是.net很基本的觀念,要使用東西前都要先初始化一下,不用特別背初始化的格式長怎樣,要使用時再上網查一下就行。
程式碼片段:
- using (PdfDocument document = PdfDocument.Open(pdfPath))
- {
- foreach (UglyToad.PdfPig.Content.Page page in document.GetPages())
- {
- sb.Append(page.Text);
- }
- }
-------------------------------------------------------------------------------------------------------
第 1 行 using 這是.net內建的用法而且相當常見,最常用到的地方,例如: 開啟檔案、連線資料庫。當離開這個using 的大括號{}裡面後,系統會自動幫你關閉檔案的占用、連線的佔用或資源占用等等。
PdfDocument document = PdfDocument.Open(pdfPath) 這是第三方套件的固定格式。我們創建一個PdfDocument型態的變數document,然後 PdfDocument.Open(pdfPath) 開啟路徑的檔案丟到 document 裡面,之後就能操作document這個變數來取得檔案內容等等的資訊。
第 3 行 PdfDocument這個型態裡面有提供取得Pdf總頁數的方法,所以我們用document.GetPages()取得所有頁數的資料,迴圈處理每一頁的資料。在迴圈裡創一個Page型態的變數page去接收每一頁的資料,不過我們要用第三方套件提供的Page型態,所以要明確地寫UglyToad.PdfPig.Content.Page系統才不會誤判。
第 5 行 在迴圈當中每次都會取回一頁的資料放在page變數裡面,然後我們用page.Text把頁面裡的文字取出來,再把文字丟到前面創的StringBuilder型態的變數 sb裡面,
sb.Append(page.Text); Append字面上的意思就是加上去,所以當迴圈跑完,每一頁的文字都被加進去後,sb裡面就存了整個pdf檔案的內容。
程式碼片段:
- string text = sb.ToString();
- Match m = Regex.Match(text, @"金\s*額\s*[::]\s*([0-9,\.]+)");
-------------------------------------------------------------------------------------------------------
第 1 行 string text 先創立一個string字串型態的變數text, sb.ToString()把sb裡面裝的pdf文字內容也轉成string型態放進去text。ToString()如字面上的意思轉成string型態。
第 2 行 Match m 先創立一個Match型態的變數m, Regex.Match(text, @"金\s*額\s*[::]\s*([0-9,\.]+)") 這是一個在程式開發不論任何語言都可以共用的方法,稱為正規表示式。 Regex.Match 是.net內建方法,如字面上意思,用Regex(正規表示式)去Match(匹配)小括號內text的內容與你想要找的某規則片段或文字,在text內容裡面如有匹配到你想要的規則,則那段匹配到規則的內容就會被取出來放進變數m裡面。
(*補充 : 正規表示式的規則還有用法博大精深,需要用到時直接問ChatGPT,會比你自己背那些規則更快且更準確喔!
因為這個正規表示式對初學者可能會有些困惑,所以我還是要重複提醒我的理念,我們先實做出來,了解大概的用法,再去精進自己,千萬不要像我之前走的冤忘路,什麼都想要理解到最透徹才往下一步,這時候就會失去對寫程式的興趣喔!因為程式牽扯到很多東西,不可能每項都完全弄懂或精通,弄懂以後可能人都老了! 所以還是要排優先順序,優先做出功能,再去理解或精通,當下不理解就先用固定且大眾的用法,回過頭來看第二遍第三遍相信你就會懂了。)
程式碼片段:
- if (m.Success)
- {
- string amount = m.Groups[1].Value;
- MessageBox.Show("金額 = " + amount);
- }
- else
- {
- MessageBox.Show("找不到金額");
- }
-------------------------------------------------------------------------------------------------------
第 1 行 先用Match型態的變數m提供的Success判斷是否有匹配成功。
第 3 行 匹配成功後我們用一個string型態的amount變數來取得匹配到的金額,m變數裡面有提供一個Groups的變數取位置[1]的值就是真正的金額。
第 4 行 MessageBox.Show是.net WindowsForm內建用法,可以彈跳出視窗顯示文字,("金額 = " + amount) 在""裡面的值,系統都會當作是字串,字串跟字串可以透過 + 號串起來,因此這裡就會組成 "金額 = 10000" 的字串顯示在這個彈跳視窗。
第 6 行 else 則是沒有達成if的條件就會進來這裡,依範例如沒有匹配到 金額: 10000 ,m.Success 就會是False , 就會進入else,我們的範例有這行字,所以就不會進入這個else。
第 8 行 MessageBox.Show是.net WindowsForm內建用法,可以彈跳出視窗顯示文字,如果很好奇又有時間的話,可以試著把範例檔改成沒有 金額: 10000 這行 ,就會彈跳出視窗顯示"找不到金額"。
結論
程式很有趣的地方就在,當你一直接觸新需求新的開發或是改善的任何需求,每當你接觸一次你就會發現你又學到更多東西,又或者你又可以更深入去探討以前使用過的技術如何改善與精進等等。這樣的過程非常的有趣,會學習到新的事物,對於技術更純熟,並且完成一項任務就會有成就感,自然而然就會很開心,又變得很有自信。
像是我們在這一章節裡面就學到了正規表示式(Regex),並且這個東西裡面也是博大精深,可以花有空的時間去了解,雖然看似在做重複的程式開發工作,但一直做下去就會發現從中還能學習到很多新事物,讓工作變得超有趣。















