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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...