C# 設置PDF表單不可編輯、或提取PDF表單數據

来源:https://www.cnblogs.com/Yesi/p/18252698
-Advertisement-
Play Games

PDF表單是PDF中的可編輯區域,允許用戶填寫指定信息。當表單填寫完成後,有時候我們可能需要將其設置為不可編輯,以保護表單內容的完整性和可靠性。或者需要從PDF表單中提取數據以便後續處理或分析。 之前文章詳細介紹過如何使用免費Spire.PDF庫通過C# 創建、填寫表單,本文將繼續介紹該免費.NET ...


PDF表單是PDF中的可編輯區域,允許用戶填寫指定信息。當表單填寫完成後,有時候我們可能需要將其設置為不可編輯,以保護表單內容的完整性和可靠性。或者需要從PDF表單中提取數據以便後續處理或分析。

之前文章詳細介紹過如何使用免費Spire.PDF庫通過C# 創建、填寫表單,本文將繼續介紹該免費.NET PDF庫支持的另外兩種操作PDF表單的功能,即:

  • 使用C# 設置PDF表單不可編輯(PDF扁平化)
  • 使用C# 提取PDF表單數據

 

免費庫安裝(2種方法):

Free Spire.PDF for .NET 免費庫支持兩種安裝方式:

  1. 通過 NuGet安裝:http://www.nuget.org/packages/FreeSpire.PDF/
  2. 點擊下載產品包,解壓縮後手動引用dll

https://www.e-iceblue.com/Download/download-pdf-for-net-free.html

 

使用C# 設置PDF表單不可編輯(PDF扁平化)

PDF 表單如文本框、覆選框、組合框等都是可編輯或可更改狀態,如果想要鎖定這些區域,我們需要將PDF表單設置為不可編輯狀態,即PDF扁平化。在Free Spire.PDF中, 我們可以通過將其提供的 PdfDocument.Form.IsFlatten 屬性設置為 "true" 來鎖定PDF表單不可編輯。

簡單代碼示例:

using Spire.Pdf;
 
namespace FlattenAllFormFields
{
    class Program
    {
        static void Main(string[] args)
        {
            //載入PDF文件
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("PDF表單.pdf");
 
            //設置所有表單不可編輯
            pdf.Form.IsFlatten = true;
 
            //保存生成文件
            pdf.SaveToFile("扁平PDF.pdf");
        }
    }
}

以上示例一鍵鎖定了PDF文件中的所有表單,如果僅需鎖定某個指定的表單域,可以參考如下代碼片段:

            //獲取PDF表單
            PdfFormWidget formWidget = (PdfFormWidget)pdf.Form;
 
            //通過表單名獲取指定表單域
            PdfField form = formWidget.FieldsWidget["姓名"];
 
            //通過索引獲取指定表單域
            PdfField form = formWidget.FieldsWidget.List[0] as PdfField;
 
            //設置表單不可編輯
            form.Flatten = true;

 

使用C# 提取PDF表單數據

在Free Spire.PDF中,每種表單域都提供了對應的類。要實現PDF表單數據的提取,我們需要先確定表單域的類型,然後再使用相應類下的屬性來提取它們的值。

完整C#示例代碼:

using Spire.Pdf;
using Spire.Pdf.Fields;
using Spire.Pdf.Widget;
using System.IO;
using System.Text;
 
namespace ExtractFormFieldValues
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //載入PDF文件
            PdfDocument doc = new PdfDocument();
            doc.LoadFromFile("PDF表單.pdf");
 
            //創建StringBuilder對象
            StringBuilder sb = new StringBuilder();
 
            //獲取PDF表單
            PdfFormWidget formWidget = doc.Form as PdfFormWidget;
 
            //遍歷表單
            for (int i = 0; i < formWidget.FieldsWidget.List.Count; i++)
            {
                PdfField field = formWidget.FieldsWidget.List[i] as PdfField;
 
                //獲取文本框的名稱和值
                if (field is PdfTextBoxFieldWidget)
                {
                    PdfTextBoxFieldWidget textBoxField = field as PdfTextBoxFieldWidget;
                    string name = textBoxField.Name;
                    string value = textBoxField.Text;
                    sb.Append("文本框名稱: " + name + "\r\n");
                    sb.Append("文本框內容: " + value + "\r\n");
                }
 
                //獲取列表框的名稱、項目和選定項
                if (field is PdfListBoxWidgetFieldWidget)
                {
                    PdfListBoxWidgetFieldWidget listBoxField = field as PdfListBoxWidgetFieldWidget;
                    string name = listBoxField.Name;
                    sb.Append("列表框名稱: " + name + "\r\n");
                    sb.Append("列表框項目: \r\n");
 
                    PdfListWidgetItemCollection items = listBoxField.Values;
 
                    foreach (PdfListWidgetItem item in items)
                    {
                        sb.Append(item.Value + "\r\n");
                    }
                    string selectedValue = listBoxField.SelectedValue;
                    sb.Append("列表框選定項: " + selectedValue + "\r\n");
                }
 
                //獲取組合框欄位的名稱、項目和選定項
                if (field is PdfComboBoxWidgetFieldWidget)
                {
                    PdfComboBoxWidgetFieldWidget comBoxField = field as PdfComboBoxWidgetFieldWidget;
                    string name = comBoxField.Name;
                    sb.Append("組合框名稱: " + name + "\r\n");
                    sb.Append("組合框項目: \r\n");
                    PdfListWidgetItemCollection items = comBoxField.Values;
 
                    foreach (PdfListWidgetItem item in items)
                    {
                        sb.Append(item.Value + "\r\n");
                    }
                    string selectedValue = comBoxField.SelectedValue;
                    sb.Append("組合框選定項: " + selectedValue + "\r\n");
 
                }
 
                //獲取單選按鈕的名稱和所選項
                if (field is PdfRadioButtonListFieldWidget)
                {
                    PdfRadioButtonListFieldWidget radioBtnField = field as PdfRadioButtonListFieldWidget;
                    string name = radioBtnField.Name;
                    sb.Append("單選按鈕名稱: " + name + "\r\n");
                    string selectedValue = radioBtnField.SelectedValue;
                    sb.Append("單選按鈕選定項: " + selectedValue + "\r\n");
                }
 
                //獲取覆選框的名稱和狀態
                if (field is PdfCheckBoxWidgetFieldWidget)
                {
                    PdfCheckBoxWidgetFieldWidget checkBoxField = field as PdfCheckBoxWidgetFieldWidget;
                    string name = checkBoxField.Name;
                    sb.Append("覆選框名稱: " + name + "\r\n");
                    bool status = checkBoxField.Checked;
                    if (status)
                    {
                        sb.Append("覆選框狀態: 已選中 \r\n");
                    }
                    else
                    {
                        sb.Append("覆選框狀態: 未選中 \r\n");
                    }
                }
 
                sb.Append("\n");
            }
 
            //將提取的數據寫入txt文件
            File.WriteAllText("提取PDF表單.txt", sb.ToString());
            doc.Dispose();
        }
    }
}

提取PDF表單的效果圖:

 

總結

免費Spire.PDF支持多種對PDF表單的操作,使用它,我們可以通過C# 輕鬆實現鎖定PDF表單以確保表單不被篡改或編輯,或者通過C# 快速提取PDF表單數據並用於各種用途,如數據分析、報告生成等。

如有興趣瞭解更多.NET程式中操作PDF文檔的示例,可點擊:Spire.PDF中文教程

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ​記錄下FFmpeg的學習筆記目錄,完整的FFmpeg開發實戰內容詳見《FFmpeg開發實戰:從零基礎到短視頻上線》一書。 下麵是補充的FFmpeg開發筆記內容目錄,主要是對《FFmpeg開發實戰:從零基礎到短視頻上線》一書的進階增補。 第一章 Linux環境編譯FFmpeg FFmpeg開發筆記( ...
  • 目錄條款32:確定你的public繼承塑模出is-a關係(Make sure public inheritance models “is-a”)public繼承的含義設計良好的繼承關係is-a的例外條款33:避免遮掩繼承而來的名稱(Avoid hiding inherited names)作用域的隱 ...
  • Python中有三種比較常見的方法類型,如類方法和靜態方法,實例方法,他們是面向對象編程中重要的概念。 1.類方法 類方法是通過使用裝飾器@classmethod來定義的,他的第一個參數是cls,指向類本身,允許我們在方法中操作類的屬性或調用其他類方法。 類方法的使用:類方法可以通過類名和實例對象來 ...
  • 大家好,我是碼農先森。 之前有朋友讓我分享從 PHP 轉 Go 的經歷,這次它來了。我主要從模仿、進階、應用這三個方面來描述轉 Go 的經歷及心得。模仿是良好的開端,進階是艱難的成長,應用是認知的提升。希望我的經歷對大家能有所啟發。 模仿 著名藝術家畢加索說過「模仿是人類一切學習的開端,然後才是創新 ...
  • 寫在前面 在之前的文章中我們有介紹過SpringAI這個項目。SpringAI 是Spring 官方社區項目,旨在簡化 Java AI 應用程式開發, 讓 Java 開發者想使用 Spring 開發普通應用一樣開發 AI 應用。 而SpringAI 主要面向的是國外的各種大模型接入,對於國內開發者可 ...
  • 目錄一、背景介紹1.1 爬取目標1.2 演示視頻1.3 軟體說明二、代碼講解2.1 調用API-搜索介面2.2 調用API-詳情介面2.3 API_KEY說明2.4 軟體界面模塊2.5 日誌模塊三、轉載聲明 一、背景介紹 1.1 爬取目標 用Python獨立開發了一款爬蟲軟體,作用是:通過搜索關鍵詞 ...
  • 大屏設置網卡開啟熱點後,經常收到反饋,手機端無法搜索到大屏熱點、或者手機連接大屏熱點失敗 這類問題一般有以下幾類情況: 1. 物理網卡IP與熱點網卡IP相同 2. 熱點網卡IP,非正常熱點IP(192.168.137.X) 熱點IP我們一般定為192.168.137.X,192.168.137.X是 ...
  • 在日常工作中,有時可能會需要獲取或修改客戶端電腦的系統時間,比如軟體設置了Licence有效期,預計2024-06-01 00:00:00到期,如果客戶手動修改了客戶端電腦時間,往前調整了一年,則軟體就可以繼續使用一年,如此迴圈往複,則Licence將形同虛設。所以有時候需要校驗客戶端電腦時間和服務... ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...