跳至頁尾內容
.NET 幫助

Refit C#(開發者如何操作)

透過在 C# 中將 RefitIronPDF 整合在一起,將兩個強大的函式庫的最佳功能結合起來,產生令人難以置信的有效應用程式。 Refit 可讓開發人員設計具有 C# 特性的 API 介面、自動產生 HTTP 請求,並保證類型安全的 API 存取,讓 RESTful API 的使用更加容易。 反過來說,IronPDF 提供了大量處理 PDF 檔案的強大功能,包括合併和註解 PDF 以及轉換 HTML 內容。 這些函式庫結合起來可提供流暢的資料呈現與檢索工作流程。 使用 Refit 等工具從 API 擷取資料,並使用 IronPDF 基於這些資料製作詳盡、優異的 PDF 報告,可以讓資料驅動的應用程式開發更有效率、更具生產力。

什麼是 Refit C#?

Refit 是適用於 .NET 的開放原始碼框架,它使用宣告式、類型安全的方法來簡化向 RESTful API 傳送 HTTP 請求的程序。Refit 透過指定 API 端點為 C# 介面點綴的特性,自動產生所需的 HTTP 用戶端程式碼。 這可大幅減少模板,並提高程式碼的可讀性。 透過在編譯期間而非執行期間偵測錯誤,此技術可保證方法簽章正確匹配 API 端點。

此外,Refit 可以輕鬆處理 JSON 序列化和反序列化,讓開發人員可以與 C# 物件互動,而不需要手動轉換 API 回覆。 透過在介面規格中直接定義 HTTP 方法、標頭和參數,屬性讓設定變得更簡單。 由於在 API 端點更新時,用戶端程式碼需要修改的地方較少,因此程式碼會變得更簡單、更容易維護。

例如,Refit 可透過在介面中建立一個具有 [Get("/users/{id}")] 屬性的方法,產生所需的 HTTP GET 請求,以取得使用者的姓名。 然後可以透過類型安全的方法呼叫來提出此請求。 Refit 為開發人員將 API 整合至 .NET 應用程式的全面性高生產力解決方案,透過抽象化管理 HTTP 客戶端相關的頭痛問題。

Refit C# (How It Works For Developers):圖 1 - Refit:適用於 .NET Core、Xamarin 和 .NET 的自動類型安全 REST 函式庫

Refit C# 的特點;

類型安全 API 可用性

Refit 可在編譯時偵測錯誤,並確保方法簽章與 API 端點相符。 此類型安全性可降低因端點不匹配或請求設定不當而造成執行時錯誤的可能性。

HTTP 用戶端宣告式

C# 介面和屬性可用於開發人員建立 API 端點,進而產生更乾淨、更易維護的 HTTP 請求程式碼。 此宣告式方法抽象出每個用戶端實作 HTTP 請求方法的複雜性。

自動序列化與反序列化

Refit 會自動處理 C# 物件到 JSON 資料的轉換。 由於開發人員不再需要手動序列化請求體或反序列化回應,資料處理變得更加簡單。

基於屬性的配置

屬性用於定義 HTTP 方法(如 GET、POST、PUT 和 DELETE)和參數。 由於配置包含標頭、請求正文、內容、路徑參數和查詢參數,因此簡單易懂。

支援非同步程式設計

Refit 使用基於任務的方法來處理異步 HTTP 請求,並能與 .NET 中的異步程式模型輕鬆互動。

可適應的網頁瀏覽器

核心 HTTP 用戶端可由開發人員透過變更逾時數、預設標頭設定,以及針對日誌、驗證和重試政策的訊息處理程式設定來自訂。

整合式錯誤管理

Refit 具備處理 HTTP 問題的內建功能,讓開發人員可以輕鬆地加入自訂的錯誤處理邏輯。

適應性

透過 Refit 對自訂序列化和反序列化轉換器的支援,開發人員可以利用多種格式或處理不尋常的資料類型。

結合相依性注入整合

Refit 非常適合符合依賴注入 (DI) 建議實務的當代 .NET 應用程式,因為它很容易整合到 DI 應用程式中。

協助驗證。

為了確保 API 調用的安全性,Refit 讓認證標頭、介面方法 (如承載令牌) 和基本認證的設定變得簡單。

建立與組態 Refit C#

以下步驟可用於在 C# 中建構並設定 Refit 用戶端:

建立新的 Visual Studio 專案

使用 Visual Studio 製作 Console 專案非常容易。 若要在 Visual Studio 中建立控制台應用程式,請遵循下列步驟:

在使用 Visual Studio 之前,請確認您的電腦已安裝該軟體。

開始新專案

開啟 Visual Studio,點選"建立新專案"選項。

Refit C# (How It Works For Developers):圖 2 - 在 Visual Studio 中,點選 "建立新專案"選項,並選擇 Console App.

從"建立新專案"方塊左側的選項中,選擇您偏好的程式語言 (例如 C#)。

從下列專案範本參考清單中,您可以選擇"Console App"或"Console App (.NET Core)"範本。

為專案命名,並選擇專案的儲存位置。

Refit C# (How It Works For Developers):圖 3 - 透過指定專案名稱、位置和解決方案名稱來設定您的 Console App。 然後按下一步。

選擇適當的 .NET Framework。 然後按一下"建立"以建立 Console 應用程式專案。

Refit C# (How It Works For Developers):圖 4 - 選擇 .NET Framework,然後按一下 "Create"。 您的 Console App 專案將會成功建立。

安裝 Refit

Refit 函式庫必須先包含在您的專案中。 您可以使用 NuGet Package Manager 安裝 Refit NuGet 套件,或使用 Visual Studio 中的 .NET CLI 來完成。

使用 .NET CLI 進行安裝:

dotnet add package Refit
dotnet add package Refit
SHELL

定義 API 介面

製作一個介面來象徵您的 API。 要定義 HTTP 方法和端點,請使用 Refit 屬性。

using Refit;
using System.Threading.Tasks;

// Define the API interface
public interface IMyApi
{
    // Get user details by ID
    [Get("/users/{id}")]
    Task<User> GetUserAsync(int id);

    // Create a new user
    [Post("/users")]
    Task<User> CreateUserAsync([Body] User user);
}

// Define the User class
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    // Other properties...
}
using Refit;
using System.Threading.Tasks;

// Define the API interface
public interface IMyApi
{
    // Get user details by ID
    [Get("/users/{id}")]
    Task<User> GetUserAsync(int id);

    // Create a new user
    [Post("/users")]
    Task<User> CreateUserAsync([Body] User user);
}

// Define the User class
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    // Other properties...
}
$vbLabelText   $csharpLabel

建立和設定 Refit 用戶端

啟動 Refit 用戶端,並視需要調整其設定。 這可以直接在您的主程式碼或服務中實作,以及應用程式中的其他位置。

using Refit;
using System;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main(string[] args)
    {
        // Define the base URL of your API
        var apiClient = RestService.For<IMyApi>("https://api.example.com");

        // Use the API client to make requests
        var user = await apiClient.GetUserAsync(1);
        Console.WriteLine($"User ID: {user.Id}, Name: {user.Name}");

        // Create a new user
        var newUser = new User { Name = "John Doe" };
        var createdUser = await apiClient.CreateUserAsync(newUser);
        Console.WriteLine($"Created User ID: {createdUser.Id}, Name: {createdUser.Name}");
    }
}
using Refit;
using System;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main(string[] args)
    {
        // Define the base URL of your API
        var apiClient = RestService.For<IMyApi>("https://api.example.com");

        // Use the API client to make requests
        var user = await apiClient.GetUserAsync(1);
        Console.WriteLine($"User ID: {user.Id}, Name: {user.Name}");

        // Create a new user
        var newUser = new User { Name = "John Doe" };
        var createdUser = await apiClient.CreateUserAsync(newUser);
        Console.WriteLine($"Created User ID: {createdUser.Id}, Name: {createdUser.Name}");
    }
}
$vbLabelText   $csharpLabel

進階組態

透過設定底層的 HttpClient,您可以進一步個人化 Refit 用戶端。 舉例來說,您可以設定逾時時間、套用標頭屬性、新增預設標頭,或使用訊息處理程式來進行重試原則、驗證和記錄。

using System.Net.Http;
using Refit;
using System;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main(string[] args)
    {
        // Configure HttpClient with custom handler and timeout
        var httpClient = new HttpClient(new HttpClientHandler
        {
            // Customize the HttpClientHandler as needed
        })
        {
            BaseAddress = new Uri("https://api.example.com"),
            Timeout = TimeSpan.FromSeconds(30)
        };

        // Add default headers if needed
        httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_TOKEN_HERE");

        // Create the Refit API client
        var apiClient = RestService.For<IMyApi>(httpClient);

        // Use the API client to make requests
        var user = await apiClient.GetUserAsync(1);
        Console.WriteLine($"User ID: {user.Id}, Name: {user.Name}");

        // Create a new user
        var newUser = new User { Name = "John Doe" };
        var createdUser = await apiClient.CreateUserAsync(newUser);
        Console.WriteLine($"Created User ID: {createdUser.Id}, Name: {createdUser.Name}");
    }
}
using System.Net.Http;
using Refit;
using System;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main(string[] args)
    {
        // Configure HttpClient with custom handler and timeout
        var httpClient = new HttpClient(new HttpClientHandler
        {
            // Customize the HttpClientHandler as needed
        })
        {
            BaseAddress = new Uri("https://api.example.com"),
            Timeout = TimeSpan.FromSeconds(30)
        };

        // Add default headers if needed
        httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_TOKEN_HERE");

        // Create the Refit API client
        var apiClient = RestService.For<IMyApi>(httpClient);

        // Use the API client to make requests
        var user = await apiClient.GetUserAsync(1);
        Console.WriteLine($"User ID: {user.Id}, Name: {user.Name}");

        // Create a new user
        var newUser = new User { Name = "John Doe" };
        var createdUser = await apiClient.CreateUserAsync(newUser);
        Console.WriteLine($"Created User ID: {createdUser.Id}, Name: {createdUser.Name}");
    }
}
$vbLabelText   $csharpLabel

您可以按照以下說明,在 C# 中建立並配置 Refit 客戶端,從而使用類型安全且可維護的 RESTful API 消耗。

Refit C# (How It Works For Developers):圖 5 - 控制台輸出

開始

安裝這兩個函式庫,使用 Refit 配置簡單的 API 用戶端以擷取資料,並使用 IronPDF 以該資料為基礎建立 PDF,是在 C# 專案中整合 Refit 與 IronPDF 的第一步。 以下是實現此目標的步驟:

什麼是 IronPDF?

IronPDF for .NET 是一個功能豐富的函式庫,用於在 .NET 應用程式中處理 PDF 文件,其名稱為 IronPDF。 利用其廣泛的功能集,使用者可以從零開始或從 HTML 資料建立 PDF,也可以透過新增、刪除或變更部分內容來變更預先存在的 PDF 文件。 IronPDF 為開發人員提供了一個強大的 API,用於建立、修改和轉換 PDF 檔案,使得在 .NET 應用程式中處理 PDF 更為容易。

IronPDF 擅長於 HTML 至 PDF 的轉換,可確保精確保留原始版面與樣式。 它非常適合從網頁內容(如報告、發票和文件)建立 PDF。 IronPDF 支援 HTML 檔案、URL 和原始 HTML 字串,可輕鬆製作高品質的 PDF 文件。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
$vbLabelText   $csharpLabel

Refit C# (How It Works For Developers):圖 6 - IronPDF for .NET:C# PDF Library

IronPDF 的主要功能

將 HTML 轉換為 PDF

IronPDF 可讓您使用 HTML 內容(包括 CSS 和 JavaScript)建立高品質的 PDF 文件。 此功能對於從動態內容或網頁建立 PDF 非常有幫助。

編輯和操作 PDF 文件

IronPDF 為已存在的 PDF 文件提供修改工具。可以從 PDF 中提取頁面,添加文字、圖像、水印或備註,並將多個 PDF 合併為一個文件。

從零開始製作 PDF

透過 IronPDF 的 API,您可以程式化的方式在新的 PDF 文件中加入文字、圖片、圖形和其他物件。 這使得動態產生 PDF 發票、報告及其他以文件為基礎的輸出成為可能。

PDF 的安全性

您可以使用 IronPDF 加密 PDF 文件並增加密碼安全性,從而管理存取權限並保護重要資料。

PDF 格式

透過將資料放入表單欄位,使用者可以使用 IronPDF 建立並填寫 PDF 表單,與 PDF 文件進行互動。

文字摘錄

IronPDF 透過從 PDF 文件中萃取文字內容,方便使用者輕鬆搜尋、分析及處理文字資料。

轉換為圖片格式

IronPDF 適用於需要影像而非 PDF 的情況,因為它可以將 PDF 文件轉換為常見的影像格式,包括 PNG、JPEG 和 BMP。

安裝 IronPDF

使用 .NET CLI 或 NuGet Package Manager 將 IronPDF 新增至您的 .NET 專案。

dotnet add package IronPdf
dotnet add package IronPdf
SHELL

整合 IronPDF 與 Refit C#。

讓我們來剖析一個結合 Refit 與 IronPDF 的 C# 程式碼範例。 在這個範例中,我們將使用 Refit 從虛擬的 RESTful API 擷取資料,並使用 IronPDF 根據這些資料建立 PDF 文件。 這是以下程式碼的操作:

using System;
using System.Threading.Tasks;
using IronPdf;
using Refit;

public class Program
{
    public static async Task Main(string[] args)
    {
        // Define the base URL of your API
        var apiClient = RestService.For<IMyApi>("https://api.example.com");

        try
        {
            // Use the API client to make requests
            var user = await apiClient.GetUserAsync(1);

            // Generate PDF with the retrieved user data
            GeneratePdf(user);
            Console.WriteLine($"User ID: {user.Id}, Name: {user.Name}");

            // Create a new user
            var rand = new Random();
            var newUser = new User { Id = rand.Next(), Name = "John Doe" };
            var createdUser = await apiClient.CreateUserAsync(newUser);
            Console.WriteLine($"Created User ID: {createdUser.Id}, Name: {createdUser.Name}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }

    // Generate a PDF from user data
    public static void GeneratePdf(User user)
    {
        // Construct HTML content for the PDF
        var htmlContent = $@"
        <html>
            <head>
                <style>
                    body {{ font-family: Arial, sans-serif; }}
                    h1 {{ color: navy; }}
                    p {{ font-size: 14px; }}
                </style>
            </head>
            <body>
                <h1>User Details</h1>
                <p><strong>ID:</strong> {user.Id}</p>
                <p><strong>Name:</strong> {user.Name}</p>
            </body>
        </html>";

        // Create an IronPDF ChromePdfRenderer instance
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);

        // Save the PDF to a file
        var filePath = "UserDetails.pdf";
        pdfDocument.SaveAs(filePath);
        Console.WriteLine($"PDF generated and saved to {filePath}");
    }
}
using System;
using System.Threading.Tasks;
using IronPdf;
using Refit;

public class Program
{
    public static async Task Main(string[] args)
    {
        // Define the base URL of your API
        var apiClient = RestService.For<IMyApi>("https://api.example.com");

        try
        {
            // Use the API client to make requests
            var user = await apiClient.GetUserAsync(1);

            // Generate PDF with the retrieved user data
            GeneratePdf(user);
            Console.WriteLine($"User ID: {user.Id}, Name: {user.Name}");

            // Create a new user
            var rand = new Random();
            var newUser = new User { Id = rand.Next(), Name = "John Doe" };
            var createdUser = await apiClient.CreateUserAsync(newUser);
            Console.WriteLine($"Created User ID: {createdUser.Id}, Name: {createdUser.Name}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }

    // Generate a PDF from user data
    public static void GeneratePdf(User user)
    {
        // Construct HTML content for the PDF
        var htmlContent = $@"
        <html>
            <head>
                <style>
                    body {{ font-family: Arial, sans-serif; }}
                    h1 {{ color: navy; }}
                    p {{ font-size: 14px; }}
                </style>
            </head>
            <body>
                <h1>User Details</h1>
                <p><strong>ID:</strong> {user.Id}</p>
                <p><strong>Name:</strong> {user.Name}</p>
            </body>
        </html>";

        // Create an IronPDF ChromePdfRenderer instance
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);

        // Save the PDF to a file
        var filePath = "UserDetails.pdf";
        pdfDocument.SaveAs(filePath);
        Console.WriteLine($"PDF generated and saved to {filePath}");
    }
}
$vbLabelText   $csharpLabel

使用 Refit 屬性,我們建構了一個名為 IMyApi 的 API 介面,並提供使用者資料擷取的端點。 我們為 API 建立一個 Refit 客戶端,並在 Main 函式中以異步方式擷取使用者資料。 在成功擷取資料的情況下,使用者物件會傳給 GeneratePdf 方法。 使用 IronPDF 的 ChromePdfRenderer 類別,我們建立 HTML 內容轉換為 PDF 文字,在 GeneratePdf 方法中表示使用者的詳細資訊,然後輸出為 PDF 文件。 之後,所建立的 PDF 會儲存在磁碟檔案中。

Refit C# (How It Works For Developers):圖 7 - 控制台輸出

以下是生成的 PDF 檔案的截圖。

Refit C# (How It Works For Developers):圖 8 - 使用 IronPDF 產生的輸出 PDF

結論

總而言之,使用 RESTful API 和 PDF 製作的開發人員有一個強而有效的解決方案,那就是 RefitIronPDF 的 C# 整合。 Refit 介面可減少模板程式碼、提高可維護性,並提供類型安全的宣告式方法,使 API 更容易被使用。然而,IronPdf 提供了大量用於製作、修改和處理 PDF 文件的工具集,讓您可以輕鬆地從 HTML 文字製作高品質的 PDF。

開發人員可以使用 Refit 從 API 輕鬆擷取資料,並透過整合這兩種工具,使用 IronPDF 以這些資料為基礎建立動態 PDF 文件。 透過此一整合,工作流程得以簡化,這也為製作動態、資料驅動的 PDF 報告、發票及其他以文件為基礎的輸出創造了大量機會。

您可以將 IronPDF 和其他 Iron Software Technologies 整合到您的企業應用程式開發堆疊中,為客戶和終端使用者提供功能豐富的高階軟體解決方案。 這個紮實的基礎也會讓專案、後端系統和流程強化變得更容易。

開發人員可以充分利用 免費試用的機會,IronPDF 的費用為 $799 。 這些技術是現代軟體開發專案的絕佳選擇,因為它們有廣泛的文件、活躍的線上開發人員社群以及定期的更新。

若要瞭解更多有關如何開始使用 IronPDF 的資訊,請造訪 HTML to PDF 的程式碼範例完整的說明文件

常見問題解答

Refit 如何簡化 .NET 中的 RESTful API 互動?

Refit 簡化了 RESTful API 交互,讓開發人員可以使用 C# 特性定義 API 介面。它會自動產生必要的 HTTP 請求,並確保類型安全的 API 訪問,從而減少樣板程式碼並提高可維護性。

IronPDF在處理PDF文件方面有哪些主要特點?

IronPDF 提供強大的 PDF 文件處理功能,包括合併、註釋和將 HTML 內容轉換為 PDF。它還支援從頭開始建立 PDF、修改現有 PDF,並包含 PDF 安全性、表單處理和文字擷取等功能。

如何使用 IronPDF 將 HTML 內容轉換為 PDF?

IronPDF 可以將 HTML 內容轉換為 PDF,並保留其原始佈局和樣式。這對於使用 HTML、CSS 和 JavaScript 從網頁或動態內容產生高品質 PDF 尤其有用。

Refit 和 IronPDF 能否整合以實現數據驅動的 PDF 生成?

是的,Refit 和 IronPDF 可以集成,從而有效地從 API 獲取數據並基於這些數據生成高品質的 PDF 報告。這種整合簡化了建立動態的、資料驅動的 PDF 文件(例如報表和發票)的工作流程。

在 C# 中將 Refit 與 PDF 庫整合有哪些優點?

在 C# 中將 Refit 與 IronPDF 等 PDF 庫集成,有助於簡化從 RESTful API 獲取資料和生成 PDF 的流程。它能確保高效處理動態數據並進行展示,使其成為現代軟體開發專案的理想選擇。

如何在.NET專案中開始使用Refit?

若要在 .NET 專案中使用 Refit,您可以透過 NuGet 套件管理器進行安裝。它允許您使用 C# 特性定義 API 接口,並自動產生 HTTP 用戶端程式碼,從而實現無縫的 API 互動。

使用 Refit 時,有哪些常見的故障排除技巧?

在排查 Refit 故障時,請確保 API 介面定義與端點規格相符,並且請求和回應資料類型定義正確。此外,請檢查網路連線是否有問題,並驗證 API 端點是否可存取。

IronPDF 如何確保高品質的 PDF 輸出?

IronPDF 能夠將包括 CSS 和 JavaScript 在內的 HTML 內容精確渲染成 PDF,同時保持原始佈局和樣式,從而確保高品質的 PDF 輸出。對於需要精確 PDF 文件格式的應用程式而言,這項功能至關重要。

Jacob Mellor,Team Iron 首席技術官
首席技術長

Jacob Mellor 是 Iron Software 的首席技術官,也是一位富有遠見的工程師,率先開發了 C# PDF 技術。作為 Iron Software 核心程式碼庫的最初開發者,他自公司成立之初便參與塑造了其產品架構,並與執行長 Cameron Rimington 一起將其發展成為一家擁有 50 多名員工、服務於 NASA、特斯拉和全球政府機構的公司。

Jacob 於 1998 年至 2001 年在曼徹斯特大學獲得土木工程一級榮譽學士學位。 1999 年,他在倫敦創辦了自己的第一家軟體公司;2005 年,他創建了自己的第一個 .NET 元件。此後,他專注於解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。