跳過到頁腳內容
產品比較

APITemplate io和IronPDF對比C# PDF庫

作為一名C#開發者,我經常在專案中遇到生成和操作PDFs的挑戰。 對於有效、可靠和易於整合的PDF解決方案的需求是我們領域中的常見問題。 這就是為什麼我決定探索APITemplateIronPDF,這兩個承諾簡化C#應用程式中與PDF相關任務的熱門工具。

在本文中,我將分享我對APITemplate和IronPDF的實際操作體驗,並比較它們的特性、性能和整合能力。 我的目標是為您提供清晰、公正的分析,以幫助您為您的下一個專案做出明智的決定。 當我第一次接觸到APITemplate和IronPDF時,我對它們解決C#開發中與PDF相關的挑戰的潛力感到興趣。 讓我們看看這兩個工具各自提供了什麼。

APITemplate

APITemplate io和IronPDF比較C# PDF程式庫:圖1

APITemplate是一個雲端為基礎的服務,專注於從模板生成PDF和圖片。 它提供了一個API,讓開發者可以通過向預先定義的模板發送JSON數據來創建文件和圖形。 在我的初步測試中,我發現APITemplate很容易使用。 我可以使用他們的網頁介面創建模板,然後使用他們的API將我的C#應用程式中的數據填入其中。

APITemplate的主要特點

以模板為基礎的生成

APITemplate的核心優勢在於其基於模板的方法。 我可以創建可重用的文件和圖片模板,這讓我在重複性任務上節省了很多時間。 它還提供了一個用於生成PDF的markdown模板編輯器。 您可以從可重用的模板中生成PDF,這些模板可以與Zapier和其他第三方整合。

JSON數據整合

JSON數據整合是我經常使用的功能之一。 它讓您能夠使用JSON數據填充模板。 這讓它與我的C#應用程式的整合變得非常簡單,因為我可以序列化對象為JSON並將其發送到API。

API控制台

API控制台功能為我節省了大量時間。 使用它,我可以直接從他們的網站上預覽和測試API呼叫,幫助我在實現之前調試和微調我的請求。

自訂的頁眉和頁腳

能夠在我的PDF中添加自訂的頁眉和頁腳是非常有價值的,特別是當創建專業的報告或發票時。 我可以輕鬆加入頁碼、日期或公司標誌。

IronPDF

APITemplate io和IronPDF比較C# PDF程式庫:圖2

IronPDF,另一方面,是一個專門為C#應用程式中的PDF操作而設計的.NET程式庫。 它提供了一系列廣泛的功能,包括PDF的創建、編輯和轉換。 其一大亮點功能是從HTML生成PDF的能力,這對基於網頁的應用程式非常有用。

我第一次使用IronPDF的經驗涉及通過NuGet安裝並直接整合到我的C#專案中。 其API整合過程非常順暢,這意味著我能夠在短時間內讓它在我的專案中運行起來。我對於能夠輕鬆編程創建PDF而無需依賴外部服務印象深刻。

我注意到的主要區別是,APITemplate在從預先定義的模板創建文件方面表現出色,而IronPDF則在C#代碼中進行自定義PDF操作方面提供了更多靈活性。 APITemplate的雲端性質意味著您不需要擔心用於PDF生成的服務器資源,但它確實需要互聯網連接。 IronPDF作為一個本地程式庫,可以離線工作但使用了您的服務器資源。

IronPDF的主要功能

從HTML創建PDF

IronPDF在從HTML內容生成PDF時表現優秀。 我廣泛使用了這一功能來動態創建報告和文件。 它只需將HTML字符串或甚至是URL傳遞給程式庫即可。 IronPDF對現代網絡標準的廣泛支持意味著我從HTML內容生成的每個PDF都是高質量的文件。

PDF操作

此功能允許我編輯現有的PDF文檔編程。 我可以將文本、圖片甚至新的頁面添加到PDF文檔中,這在更新報告或表單時非常有用。

PDF合併和拆分

當處理大型文檔時,我發現這一功能特別方便。 IronPDF使得合併多個PDF為一個或拆分單個PDF為多個文件變得容易。

文本提取

當我需要從PDF中提取文本內容以進行分析或索引時,IronPDF的文本提取能力就派上用場。 它能很好地處理各種PDF佈局,讓數據提取變得輕而易舉。

表單填寫

對於涉及自動化表單填寫的專案,IronPDF的表單填寫功能非常有用。 我可以編程填充PDF表單,從而節省手動輸入數據的時間。

數位簽名

在我的許多專案中,安全性至關重要。 IronPDF允許我將數位簽名添加到PDF中,提高文檔的真實性和安全性。

密碼保護

在處理敏感文檔時,我使用IronPDF為PDF添加密碼保護。 在確保我的機密信息保持安全方面,這是非常有幫助的。

PDF轉換為圖片

有時我需要將PDF頁面轉換為圖片以便預覽或縮圖。 IronPDF使這一過程簡單明瞭,只需少數代碼行就能支持各種圖片格式。

跨平台兼容性

作為一名處理跨平台專案的.NET開發者,我欣賞IronPDF能夠在不同操作系統中無縫運作,這要歸功於其對.NET Standard的支持。

為您的C#專案設置IronPDF和APITemplate

在C#專案中設置這些工具相當簡單。 我會根據我的經驗帶您了解IronPDF和APITemplate的設置過程。

IronPDF

為了在我的C#專案中設置IronPDF,我遵循以下步驟:

  1. 在Visual Studio中打開我的專案。

  2. 使用NuGet套件管理器安裝IronPDF。 我使用NuGet套件管理器或套件管理器控制台。

    1. 在NuGet套件管理器中,搜索IronPDF並安裝。

APITemplate io和IronPDF比較C# PDF程式庫:圖3

  1. 或者,在套件管理器控制台中,我運行:

    Install-Package IronPdf

    APITemplate io和IronPDF比較C# PDF程式庫:圖4

  1. 安裝後,我在我的C#文件頂部添加必要的using語句:

    using IronPdf;
    using IronPdf;
    $vbLabelText   $csharpLabel
  2. 為了啟用授權,我在應用程式啟動初期添加這行代碼:

    IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
    IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
    $vbLabelText   $csharpLabel

就這樣! 現在我可以在代碼中使用IronPDF。

APITemplate

對於APITemplate,由於它是一個基於網頁的API,設置過程有點不同:

  1. 首先,我在他們的網站上註冊一個APITemplate帳號。
  2. 註冊後,我進入API部分以獲取我的API密鑰。
  3. 在我的C#專案中,我不需要安裝任何特定的程式包。 我通常使用內建的HttpClient來進行API呼叫。

  4. 我安全地存儲API密鑰。 在開發中,我可能會使用用戶密鑰:

    dotnet user-secrets set "APITemplate:ApiKey" "YOUR-API-KEY-HERE"
    dotnet user-secrets set "APITemplate:ApiKey" "YOUR-API-KEY-HERE"
    SHELL
  5. 在我的代碼中,我使用API密鑰設置HttpClient:

    using System.Net.Http;
    using System.Net.Http.Headers;
    
    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("X-API-KEY", Configuration["APITemplate:ApiKey"]);
    using System.Net.Http;
    using System.Net.Http.Headers;
    
    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("X-API-KEY", Configuration["APITemplate:ApiKey"]);
    $vbLabelText   $csharpLabel
  6. 現在我已準備好對APITemplate進行API呼叫。

對於這個專案,我會使用APITemplate的官方GitHub示例專案,該專案已經配置好,您只需添加模板密鑰即可。 設置完成後,我可以開始在我的C#專案中使用IronPDF和APITemplate。 IronPDF在我的應用程式中本地運行,而APITemplate需要網際網路連接才能與其服務器通信。

IronPDF與APITemplate的高級功能

作為一名C#開發者,我有機會探索IronPDF和APITemplate。 讓我們看看一些令我印象深刻的高級功能。

IronPDF高級功能

支持JavaScript的HTML到PDF轉換

IronPDF的HTML到PDF轉換令人印象深刻。它不僅只渲染靜態HTML,它還可以處理JavaScript。 這對於我在處理動態網絡內容時是個重大優勢。

這是我如何使用它的快速示例:

var Renderer = new ChromePdfRenderer();
string htmlContent = @"
    <html>
    <body>
        <h1>Dynamic Chart</h1>
        <canvas id='myChart'></canvas>
        <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
        <script>
            var ctx = document.getElementById('myChart').getContext('2d');
            new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
                    datasets: [{
                        label: '# of Votes',
                        data: [12, 19, 3, 5, 2, 3],
                        backgroundColor: [
                            'rgba(255, 99, 132, 0.2)',
                            'rgba(54, 162, 235, 0.2)',
                            'rgba(255, 206, 86, 0.2)',
                            'rgba(75, 192, 192, 0.2)',
                            'rgba(153, 102, 255, 0.2)',
                            'rgba(255, 159, 64, 0.2)'
                        ],
                        borderColor: [
                            'rgba(255, 99, 132, 1)',
                            'rgba(54, 162, 235, 1)',
                            'rgba(255, 206, 86, 1)',
                            'rgba(75, 192, 192, 1)',
                            'rgba(153, 102, 255, 1)',
                            'rgba(255, 159, 64, 1)'
                        ],
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            beginAtZero: true
                        }
                    }
                }
            });
        </script>
    </body>
    </html>";
var PDF = Renderer.RenderHtmlAsPdf(htmlContent);
PDF.SaveAs("dynamic_chart.pdf");
var Renderer = new ChromePdfRenderer();
string htmlContent = @"
    <html>
    <body>
        <h1>Dynamic Chart</h1>
        <canvas id='myChart'></canvas>
        <script src='https://cdn.jsdelivr.net/npm/chart.js'></script>
        <script>
            var ctx = document.getElementById('myChart').getContext('2d');
            new Chart(ctx, {
                type: 'bar',
                data: {
                    labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
                    datasets: [{
                        label: '# of Votes',
                        data: [12, 19, 3, 5, 2, 3],
                        backgroundColor: [
                            'rgba(255, 99, 132, 0.2)',
                            'rgba(54, 162, 235, 0.2)',
                            'rgba(255, 206, 86, 0.2)',
                            'rgba(75, 192, 192, 0.2)',
                            'rgba(153, 102, 255, 0.2)',
                            'rgba(255, 159, 64, 0.2)'
                        ],
                        borderColor: [
                            'rgba(255, 99, 132, 1)',
                            'rgba(54, 162, 235, 1)',
                            'rgba(255, 206, 86, 1)',
                            'rgba(75, 192, 192, 1)',
                            'rgba(153, 102, 255, 1)',
                            'rgba(255, 159, 64, 1)'
                        ],
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        y: {
                            beginAtZero: true
                        }
                    }
                }
            });
        </script>
    </body>
    </html>";
var PDF = Renderer.RenderHtmlAsPdf(htmlContent);
PDF.SaveAs("dynamic_chart.pdf");
$vbLabelText   $csharpLabel

這段代碼使用Chart.js生成一個動態圖表的PDF。 JavaScript在PDF創建過程中執行,生成的PDF包含渲染的圖表。 我已經用這個來創建數據頻繁變化的動態報告,省去了手動更新圖表的麻煩。

APITemplate io和IronPDF比較C# PDF程式庫:圖5

能夠包括外部腳本,例如本示例中的Chart.js,意味著我可以使用強大的JavaScript程式庫來在我的PDF中創建豐富的動態內容。 此外,這個功能允許我在HTML中使用CSS和響應式設計技術,以確保生成的PDF在各種設備和打印格式上看起來很棒。 我甚至使用媒體查詢從同一HTML源創建優化屏幕查看和打印的PDF。

PDF加密與解密

在我的許多專案中,安全性至關重要,尤其是處理敏感信息時。 IronPDF的加密和解密能力在這些情況下非常有價值。

var pdf = PdfDocument.FromFile("input.pdf");
// Set user password (for opening the document)
pdf.Password = "user_password";
// Set owner password (for editing, printing, etc.)
pdf.OwnerPassword = "owner_password";
// Set specific permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit;
pdf.SaveAs("highly_secured.pdf");
var pdf = PdfDocument.FromFile("input.pdf");
// Set user password (for opening the document)
pdf.Password = "user_password";
// Set owner password (for editing, printing, etc.)
pdf.OwnerPassword = "owner_password";
// Set specific permissions
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = IronPdf.Security.PdfEditSecurity.NoEdit;
pdf.SaveAs("highly_secured.pdf");
$vbLabelText   $csharpLabel

APITemplate io和IronPDF比較C# PDF程式庫:圖6

這段代碼不僅用用戶密碼加密了PDF,還設置了一個具有權限的所有者密碼。 我可以精確指定用戶可以及不可以對PDF做什麼,比如打印和复制內容等。

對於解密,我經常使用這種方法:

try
{
    var pdf = PdfDocument.FromFile("encrypted.pdf", "user_password");
    pdf.SecuritySettings.RemovePasswordsAndEncryption();
    pdf.SaveAs("decrypted.pdf");
    Console.WriteLine("PDF decrypted successfully!");
}
catch (Exception ex)
{
    Console.WriteLine($"Decryption failed: {ex.Message}");
}
try
{
    var pdf = PdfDocument.FromFile("encrypted.pdf", "user_password");
    pdf.SecuritySettings.RemovePasswordsAndEncryption();
    pdf.SaveAs("decrypted.pdf");
    Console.WriteLine("PDF decrypted successfully!");
}
catch (Exception ex)
{
    Console.WriteLine($"Decryption failed: {ex.Message}");
}
$vbLabelText   $csharpLabel

這段代碼嘗試用用戶密碼打開加密的PDF,刪除所有安全限制,並將其保存為一個新的未加密文件。try-catch塊有助於處理密碼可能不正確的情況。

我在各種情況下使用了這些功能,例如創建安全文件管理系統,不同用戶對PDF有不同級別的訪問權限。 例如,在一個醫療記錄系統中,我確保敏感的患者信息是加密的,並且只有授權人員才能訪問。

PDF壓縮

當處理大量PDF時,文件大小成為關鍵因素。 IronPDF的壓縮功能在管理存儲和帶寬限制方面救了我。

以下是我使用壓縮功能的更高級示例:

using IronPdf;
using System.IO;
using PdfDocument = IronPdf.PdfDocument;

var PDF = PdfDocument.FromFile(@"F:/Test.pdf");
// Compress images
PDF.CompressImages(80); // 80% quality
// Compress fonts
PDF.CompressStructTree();
// Save the compressed PDF
PDF.SaveAs(@"F:/highly_compressed.pdf");
// Compare file sizes
var originalSize = new FileInfo(@"F:/Test.pdf").Length;
var compressedSize = new FileInfo(@"F:/highly_compressed.pdf").Length;
var compressionRatio = (1 - (double)compressedSize / originalSize) * 100;
Console.WriteLine($"Original size: {originalSize / 1024} KB");
Console.WriteLine($"Compressed size: {compressedSize / 1024} KB");
Console.WriteLine($"Compression ratio: {compressionRatio:F2}%");
using IronPdf;
using System.IO;
using PdfDocument = IronPdf.PdfDocument;

var PDF = PdfDocument.FromFile(@"F:/Test.pdf");
// Compress images
PDF.CompressImages(80); // 80% quality
// Compress fonts
PDF.CompressStructTree();
// Save the compressed PDF
PDF.SaveAs(@"F:/highly_compressed.pdf");
// Compare file sizes
var originalSize = new FileInfo(@"F:/Test.pdf").Length;
var compressedSize = new FileInfo(@"F:/highly_compressed.pdf").Length;
var compressionRatio = (1 - (double)compressedSize / originalSize) * 100;
Console.WriteLine($"Original size: {originalSize / 1024} KB");
Console.WriteLine($"Compressed size: {compressedSize / 1024} KB");
Console.WriteLine($"Compression ratio: {compressionRatio:F2}%");
$vbLabelText   $csharpLabel

這是結果:

APITemplate io和IronPDF比較C# PDF程式庫:圖7

我發現這些技術的組合在減小文件大小方面非常有效,而不會大幅影響質量。

我在各種情景下使用了這一功能:

  1. 郵件附件:當通過電子郵件發送PDF時,我壓縮它們以確保它們不超過附件大小限制。
  2. Web應用:对于需要用戶下載的PDF,壓縮有助於減少加載時間和帶寬使用。
  3. 存檔:對於長期保留的大量PDF,壓縮大大降低了存儲成本。

在一個專案中,我在一家律師事務所建立了一個文檔管理系統。 他們有成千上萬的PDF格式的案例文件,其中許多是掃描文件,尺寸較大。 通過實施這種壓縮技術,我們的存儲需求減少了超過60%,從而大大縮減了他們的雲存儲帳單成本。

數位簽名

在PDF中添加數位簽名是許多業務流程中必備的功能,以確保文件真實性和不可否認性。 IronPDF讓這一複雜的任務變得意外地簡單。 以下是一個更詳細的數位簽名實施示例:

using IronPdf;
using IronPdf.Signing;

var renderer = new ChromePdfRenderer();
var pdf = PdfDocument.FromFile(@"F:/Contract.pdf");
var signature = new IronPdf.Signing.PdfSignature(@"F:/Iron.pfx", "123")
{
    // Step 3. Optional signing options and a handwritten signature graphic
    SigningContact = "support@ironsoftware.com",
    SigningLocation = "New York, USA",
    SigningReason = "Signing PDF"
};
pdf.Sign(signature);
pdf.SaveAs(@"F:/signed.pdf");
using IronPdf;
using IronPdf.Signing;

var renderer = new ChromePdfRenderer();
var pdf = PdfDocument.FromFile(@"F:/Contract.pdf");
var signature = new IronPdf.Signing.PdfSignature(@"F:/Iron.pfx", "123")
{
    // Step 3. Optional signing options and a handwritten signature graphic
    SigningContact = "support@ironsoftware.com",
    SigningLocation = "New York, USA",
    SigningReason = "Signing PDF"
};
pdf.Sign(signature);
pdf.SaveAs(@"F:/signed.pdf");
$vbLabelText   $csharpLabel

我在幾個實際應用中使用了這一功能:

  1. 合同管理系統:我們為一家公司實施了這一系統,該公司需要通過電子方式發送和接收簽署的合同。 數位簽名確保了合同的法律有效性。
  2. 醫療記錄系統:在一個醫療應用中,我們使用數位簽名讓醫生能夠簽署患者記錄和處方。
  3. 政府文件處理:對於一個政府部門,我們實施了一個系統,可以在其上對官方文件進行數位簽名。

PDF拆分與合併

能夠拆分和合併PDF是一項我常常在文件管理系統中使用的重要功能。 IronPDF對這些功能的實施既強大又靈活。 這是拆分和合併PDF的更高階示例:

using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        // Create first PDF with three pages
        const string html_a = @"
            <h1>Document A</h1>
            <p>This is the first page of Document A.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document A - Page 2</h2>
            <p>This is the second page of Document A.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document A - Page 3</h2>
            <p>This is the third and final page of Document A.</p>";
        // Create second PDF with two pages
        const string html_b = @"
            <h1>Document B</h1>
            <p>Welcome to the first page of Document B.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document B - Page 2</h2>
            <p>This is the second and last page of Document B.</p>";
        // Render HTML to PDF
        var renderer = new ChromePdfRenderer();
        var pdfdoc_a = renderer.RenderHtmlAsPdf(html_a);
        var pdfdoc_b = renderer.RenderHtmlAsPdf(html_b);
        // Merge PDFs
        var merged = PdfDocument.Merge(pdfdoc_a, pdfdoc_b);
        merged.SaveAs(@"F:/IronPdf/MergedDocument.pdf");
        Console.WriteLine("Merged PDF created: MergedDocument.pdf");
        // Load the merged PDF
        var pdf = PdfDocument.FromFile(@"F:/IronPdf/MergedDocument.pdf");
        // Extract the first page
        var firstPage = pdf.CopyPage(0);
        firstPage.SaveAs(@"F:/IronPdf/FirstPageOnly.pdf");
        Console.WriteLine("First page extracted: FirstPageOnly.pdf");
        // Extract pages 2 to 4 (note: index starts at 0)
        var middlePages = pdf.CopyPages(1, 3);
        middlePages.SaveAs(@"F:/IronPdf/Pages2to4.pdf");
        Console.WriteLine("Pages 2 to 4 extracted: Pages2to4.pdf");
        Console.WriteLine("Process completed. Press any key to exit.");
        Console.ReadKey();
    }
}
using IronPdf;
class Program
{
    static void Main(string[] args)
    {
        // Create first PDF with three pages
        const string html_a = @"
            <h1>Document A</h1>
            <p>This is the first page of Document A.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document A - Page 2</h2>
            <p>This is the second page of Document A.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document A - Page 3</h2>
            <p>This is the third and final page of Document A.</p>";
        // Create second PDF with two pages
        const string html_b = @"
            <h1>Document B</h1>
            <p>Welcome to the first page of Document B.</p>
            <div style='page-break-after: always;'></div>
            <h2>Document B - Page 2</h2>
            <p>This is the second and last page of Document B.</p>";
        // Render HTML to PDF
        var renderer = new ChromePdfRenderer();
        var pdfdoc_a = renderer.RenderHtmlAsPdf(html_a);
        var pdfdoc_b = renderer.RenderHtmlAsPdf(html_b);
        // Merge PDFs
        var merged = PdfDocument.Merge(pdfdoc_a, pdfdoc_b);
        merged.SaveAs(@"F:/IronPdf/MergedDocument.pdf");
        Console.WriteLine("Merged PDF created: MergedDocument.pdf");
        // Load the merged PDF
        var pdf = PdfDocument.FromFile(@"F:/IronPdf/MergedDocument.pdf");
        // Extract the first page
        var firstPage = pdf.CopyPage(0);
        firstPage.SaveAs(@"F:/IronPdf/FirstPageOnly.pdf");
        Console.WriteLine("First page extracted: FirstPageOnly.pdf");
        // Extract pages 2 to 4 (note: index starts at 0)
        var middlePages = pdf.CopyPages(1, 3);
        middlePages.SaveAs(@"F:/IronPdf/Pages2to4.pdf");
        Console.WriteLine("Pages 2 to 4 extracted: Pages2to4.pdf");
        Console.WriteLine("Process completed. Press any key to exit.");
        Console.ReadKey();
    }
}
$vbLabelText   $csharpLabel

APITemplate io和IronPDF比較C# PDF程式庫:圖8

這是通過代碼生成的合併文檔:

APITemplate io和IronPDF比較C# PDF程式庫:圖9

表單填寫

自動化表單填寫在我的許多專案中節省了大量時間。 IronPDF允許我編程填充PDF表單,這對於處理大量表單或創建個性化文件是無價的。 以下是更全面的表單填寫示例:

using IronPdf;
using System;

// Load the combined form
PdfDocument pdf = PdfDocument.FromFile(@"F:/completeForm.pdf");

// Handle radio buttons
var radioForm = pdf.Form.FindFormField("traveltype");
radioForm.Value = "Airplane";

// Handle checkbox
var checkboxForm = pdf.Form.FindFormField("taskCompleted");
checkboxForm.Value = "Yes";

// Handle combobox
var comboboxForm = pdf.Form.FindFormField("priority");
comboboxForm.Value = "Low";

// Print out all the available choices for combobox
foreach (var choice in comboboxForm.Choices)
{
    Console.WriteLine(choice);
}

// Handle text inputs
pdf.Form.FindFormField("firstname").Value = "John";
pdf.Form.FindFormField("lastname").Value = "Smith";

// Handle text area
pdf.Form.FindFormField("address").Value = "Iron Software\r\n205 N. Michigan Ave.";

// Save the edited PDF
pdf.SaveAs(@"F:/completeFormEdited.pdf");
using IronPdf;
using System;

// Load the combined form
PdfDocument pdf = PdfDocument.FromFile(@"F:/completeForm.pdf");

// Handle radio buttons
var radioForm = pdf.Form.FindFormField("traveltype");
radioForm.Value = "Airplane";

// Handle checkbox
var checkboxForm = pdf.Form.FindFormField("taskCompleted");
checkboxForm.Value = "Yes";

// Handle combobox
var comboboxForm = pdf.Form.FindFormField("priority");
comboboxForm.Value = "Low";

// Print out all the available choices for combobox
foreach (var choice in comboboxForm.Choices)
{
    Console.WriteLine(choice);
}

// Handle text inputs
pdf.Form.FindFormField("firstname").Value = "John";
pdf.Form.FindFormField("lastname").Value = "Smith";

// Handle text area
pdf.Form.FindFormField("address").Value = "Iron Software\r\n205 N. Michigan Ave.";

// Save the edited PDF
pdf.SaveAs(@"F:/completeFormEdited.pdf");
$vbLabelText   $csharpLabel

我在幾個實際應用中使用了這一功能:

  1. HR入職系統:我們創建了一個系統,能根據HR資料庫中的信息自動填寫新員工文書工作,節省了大量手動輸入數據的時間。

  2. 保險理賠處理:對於一家保險公司,我們建立了一個系統,能預填保單持有人的理賠表單,大大加快了理賠提交過程。

  3. 學校申請系統:在一個教育專案中,我們實施了一個系統,可以根據學生數據填寫學校申請表,讓申請過程對學生和行政人員來說更容易。

  4. 稅表生成:對於一家會計公司,我們創建了一個系統,能根據客戶財務數據自動填寫稅表,在報稅季節減少錯誤並節省時間。

程序化填寫表格的能力是許多業務流程自動化的關鍵因素,帶來了大量時間的節省並降低了手動數據輸入的錯誤。

浮水印加蓋

為PDF添加浮水印通常對品牌營銷、安全性或狀態指示是必要的。 IronPDF提供了靈活的浮水印功能,我在許多專案中都發現它非常有用。 這是一個更詳細的浮水印使用示例:

using IronPdf;
using IronSoftware.Drawing;

string watermarkHtml = @"
<img style='width: 250px;' src='https://ironsoftware.com/img/products/ironpdf-logo-text-dotnet.svg'>
<h1>Iron Software</h1>";

ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Watermark</h1>");

// Apply watermark with 45 degrees rotation and 70% opacity
pdf.ApplyWatermark(watermarkHtml, rotation: 30, opacity: 90);
pdf.SaveAs("watermarkOpacity&amp;Rotation.pdf");
using IronPdf;
using IronSoftware.Drawing;

string watermarkHtml = @"
<img style='width: 250px;' src='https://ironsoftware.com/img/products/ironpdf-logo-text-dotnet.svg'>
<h1>Iron Software</h1>";

ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Watermark</h1>");

// Apply watermark with 45 degrees rotation and 70% opacity
pdf.ApplyWatermark(watermarkHtml, rotation: 30, opacity: 90);
pdf.SaveAs("watermarkOpacity&amp;Rotation.pdf");
$vbLabelText   $csharpLabel

APITemplate io和IronPDF比較C# PDF程式庫:圖10

APITemplate高級功能

動態模板生成

APITemplate的動態模板生成是一個強大功能,可以使用自定義JSON數據創建高度可自訂的文件。 APITemplate的API支持動態組件。 您的代碼可以獲得PDF和圖片輸出。 在API控制台中,我可以使用所見即所得(WYSIWYG)編輯器輕鬆生成PDF文件。

讓我們探索一下我在專案中怎麼使用它的。

using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "bf077b23b4a407ae";
            var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
            var data = new
            {
                date = "15/05/2022",
                invoice_no = "435568799",
                sender_address1 = "3244 Jurong Drive",
                sender_address2 = "Falmouth Maine 1703",
                sender_phone = "255-781-6789",
                sender_email = "dev@ironsoftware.com",
                rece_addess1 = "2354 Lakeside Drive",
                rece_addess2 = "New York 234562 ",
                rece_phone = "34333-84-223",
                rece_email = "info@ironsoftware.com",
                items = new[]
                {
                    new { item_name = "Oil", unit = 1, unit_price = 100, total = 100 },
                    new { item_name = "Rice", unit = 2, unit_price = 200, total = 400 },
                    new { item_name = "Orange", unit = 7, unit_price = 20, total = 1400 }
                },
                total = "total",
                footer_email = "info@ironsoftware.com"
            };
            var json_content = JsonSerializer.Serialize(data);
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo(@"F:/generated_document.pdf");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
                Console.WriteLine("PDF file has been downloaded and saved as 'generated_document.pdf'");
            }
        }
    }
}
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "bf077b23b4a407ae";
            var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
            var data = new
            {
                date = "15/05/2022",
                invoice_no = "435568799",
                sender_address1 = "3244 Jurong Drive",
                sender_address2 = "Falmouth Maine 1703",
                sender_phone = "255-781-6789",
                sender_email = "dev@ironsoftware.com",
                rece_addess1 = "2354 Lakeside Drive",
                rece_addess2 = "New York 234562 ",
                rece_phone = "34333-84-223",
                rece_email = "info@ironsoftware.com",
                items = new[]
                {
                    new { item_name = "Oil", unit = 1, unit_price = 100, total = 100 },
                    new { item_name = "Rice", unit = 2, unit_price = 200, total = 400 },
                    new { item_name = "Orange", unit = 7, unit_price = 20, total = 1400 }
                },
                total = "total",
                footer_email = "info@ironsoftware.com"
            };
            var json_content = JsonSerializer.Serialize(data);
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo(@"F:/generated_document.pdf");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
                Console.WriteLine("PDF file has been downloaded and saved as 'generated_document.pdf'");
            }
        }
    }
}
$vbLabelText   $csharpLabel

APITemplate io和IronPDF比較C# PDF程式庫:圖11

這是生成的PDF文件:

APITemplate io和IronPDF比較C# PDF程式庫:圖12

批量PDF生成

APITemplate的批量PDF生成功能在一次API呼叫中創建多個文件時是一大優勢。 以下是我如何使用它的更詳細示例:

using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Collections.Generic;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "d4f77b23b4ab09fa";
            var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
            var membershipCards = new List<object>
            {
                new { name = "Iron Dev 1", email = "dev1@ironsoftware.com", membership_id = "M001", expiry_date = "2024-12-31" },
                new { name = "Iron Dev 2", email = "dev2@ironsoftware.com", membership_id = "M002", expiry_date = "2025-06-30" },
                new { name = "Iron Dev 3", email = "dev3@ironsoftware.com", membership_id = "M003", expiry_date = "2024-09-15" }
            };
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            for (int i = 0; i < membershipCards.Count; i++)
            {
                var json_content = JsonSerializer.Serialize(membershipCards[i]);
                var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
                var byteContent = new ByteArrayContent(buffer);
                Console.WriteLine($"Creating PDF for {((dynamic)membershipCards[i]).name}...");
                var response = await client.PostAsync(url, byteContent);
                var ret = await response.Content.ReadAsStringAsync();
                var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
                if (returnContent.status == "success")
                {
                    Console.WriteLine($"Downloading {returnContent.download_url}...");
                    var download_response = await client.GetAsync(returnContent.download_url);
                    using (var stream = await download_response.Content.ReadAsStreamAsync())
                    {
                        var fileInfo = new FileInfo($"F:/membership_card_{i + 1}.pdf");
                        using (var fileStream = fileInfo.OpenWrite())
                        {
                            await stream.CopyToAsync(fileStream);
                        }
                    }
                    Console.WriteLine($"PDF file has been downloaded and saved as 'membership_card_{i + 1}.pdf'");
                }
                else
                {
                    Console.WriteLine($"Failed to create PDF for {((dynamic)membershipCards[i]).name}. Status: {returnContent.status}");
                }
            }
        }
    }
}
using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Collections.Generic;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "d4f77b23b4ab09fa";
            var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={template_id}";
            var membershipCards = new List<object>
            {
                new { name = "Iron Dev 1", email = "dev1@ironsoftware.com", membership_id = "M001", expiry_date = "2024-12-31" },
                new { name = "Iron Dev 2", email = "dev2@ironsoftware.com", membership_id = "M002", expiry_date = "2025-06-30" },
                new { name = "Iron Dev 3", email = "dev3@ironsoftware.com", membership_id = "M003", expiry_date = "2024-09-15" }
            };
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            for (int i = 0; i < membershipCards.Count; i++)
            {
                var json_content = JsonSerializer.Serialize(membershipCards[i]);
                var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
                var byteContent = new ByteArrayContent(buffer);
                Console.WriteLine($"Creating PDF for {((dynamic)membershipCards[i]).name}...");
                var response = await client.PostAsync(url, byteContent);
                var ret = await response.Content.ReadAsStringAsync();
                var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
                if (returnContent.status == "success")
                {
                    Console.WriteLine($"Downloading {returnContent.download_url}...");
                    var download_response = await client.GetAsync(returnContent.download_url);
                    using (var stream = await download_response.Content.ReadAsStreamAsync())
                    {
                        var fileInfo = new FileInfo($"F:/membership_card_{i + 1}.pdf");
                        using (var fileStream = fileInfo.OpenWrite())
                        {
                            await stream.CopyToAsync(fileStream);
                        }
                    }
                    Console.WriteLine($"PDF file has been downloaded and saved as 'membership_card_{i + 1}.pdf'");
                }
                else
                {
                    Console.WriteLine($"Failed to create PDF for {((dynamic)membershipCards[i]).name}. Status: {returnContent.status}");
                }
            }
        }
    }
}
$vbLabelText   $csharpLabel

這段代碼在一次API呼叫中生成多張會員卡。 每張卡都根據個別會員信息進行自定義。 這是由這段代碼生成的一張卡:

APITemplate io和IronPDF比較C# PDF程式庫:圖13

圖片生成

雖然PDF生成是APITemplate的主要焦點,但其圖片生成能力同樣令人印象深刻。您可以在控制台中使用圖片模板生成社交媒體圖片。 它還提供一個響應式圖片智能裁剪。橫幅生成API與圖片API相同。 這是一個我如何使用它的更複雜示例:

using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "f4377b23b4aeeed0";
            var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
            var json_content = @"{
    ""overrides"": [
        {
            ""name"": ""rect_image_bg"",
            ""stroke"": ""grey"",
            ""src"": ""https://images.unsplash.com/photo-1542401886-65d6c61db217?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHwzfHxkZXNlcnR8ZW58MHwwfHx8MTYyMTUxOTI2OA&ixlib=rb-1.2.1&q=80&w=1080""
        },
        {
            ""name"": ""rect_container"",
            ""stroke"": ""grey"",
            ""backgroundColor"": ""rgba(255, 255, 255, 0.62)""
        },
        {
            ""name"": ""text_quote"",
            ""text"": ""Just witnessed the most breathtaking sunset over the Sahara. The way the light dances on the dunes, painting the sky in shades of orange and purple, is truly magical. Nature's artistry at its finest!  #DesertAdventures #SaharaSkies"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#414141""
        },
        {
            ""name"": ""text_footer"",
            ""text"": ""2024-07-30 - Twitter - iPhone 16 Pro"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#666666""
        },
        {
            ""name"": ""circle_profile"",
            ""stroke"": ""grey"",
            ""src"": ""https://images.unsplash.com/photo-1520998116484-6eeb2f72b5b9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHw2Mnx8aGFwcHl8ZW58MHwwfHx8MTYyMTY5MjkwNw&ixlib=rb-1.2.1&q=80&w=1080""
        },
        {
            ""name"": ""text_name"",
            ""text"": ""Sarah Wanderlust"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#4E4E4E""
        },
        {
            ""name"": ""text_twitter"",
            ""text"": ""@sarahexplores"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#4E4E4E""
        }
    ]
}";
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo("image.jpeg");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
            }
        }
    }
}
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "a9e4MjA2NTg6MTc3Njk6Uk1ZSzVjTWs1T3d6VE9Mdw=";
            var template_id = "f4377b23b4aeeed0";
            var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
            var json_content = @"{
    ""overrides"": [
        {
            ""name"": ""rect_image_bg"",
            ""stroke"": ""grey"",
            ""src"": ""https://images.unsplash.com/photo-1542401886-65d6c61db217?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHwzfHxkZXNlcnR8ZW58MHwwfHx8MTYyMTUxOTI2OA&ixlib=rb-1.2.1&q=80&w=1080""
        },
        {
            ""name"": ""rect_container"",
            ""stroke"": ""grey"",
            ""backgroundColor"": ""rgba(255, 255, 255, 0.62)""
        },
        {
            ""name"": ""text_quote"",
            ""text"": ""Just witnessed the most breathtaking sunset over the Sahara. The way the light dances on the dunes, painting the sky in shades of orange and purple, is truly magical. Nature's artistry at its finest!  #DesertAdventures #SaharaSkies"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#414141""
        },
        {
            ""name"": ""text_footer"",
            ""text"": ""2024-07-30 - Twitter - iPhone 16 Pro"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#666666""
        },
        {
            ""name"": ""circle_profile"",
            ""stroke"": ""grey"",
            ""src"": ""https://images.unsplash.com/photo-1520998116484-6eeb2f72b5b9?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxOTc1MDZ8MHwxfHNlYXJjaHw2Mnx8aGFwcHl8ZW58MHwwfHx8MTYyMTY5MjkwNw&ixlib=rb-1.2.1&q=80&w=1080""
        },
        {
            ""name"": ""text_name"",
            ""text"": ""Sarah Wanderlust"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#4E4E4E""
        },
        {
            ""name"": ""text_twitter"",
            ""text"": ""@sarahexplores"",
            ""textBackgroundColor"": ""rgba(246, 243, 243, 0)"",
            ""color"": ""#4E4E4E""
        }
    ]
}";
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo("image.jpeg");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
            }
        }
    }
}
$vbLabelText   $csharpLabel

APITemplate io和IronPDF比較C# PDF程式庫:圖14

此示例生成了一個包含動態內容、自定義背景色和內嵌產品圖片的產品促銷圖。

QR Code生成

APITemplate內建的QR Code生成功能,使我的許多專案增色不少。 您可以將數據URL放在QR Code的內容位置。 這是一個我如何使用它的更複雜示例:

using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "API-Key";
            var template_id = "Template-Key";
            var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
            var json_content = @"{
    ""overrides"": [
        {
            ""name"": ""background-color"",
            ""stroke"": ""grey"",
            ""backgroundColor"": ""#FFFFFF""
        },
        {
            ""name"": ""qr_1"",
            ""content"": ""http://ironpdf.com/"",
            ""backgroundColor"": ""white"",
            ""color"": ""#000000""
        }
    ]
}";
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            //Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            Console.WriteLine(returnContent.status);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo(@"F:/QRimage.jpeg");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
            }
        }
    }
}
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace csharp
{
    class ReturnContent
    {
        public string download_url { get; set; }
        public string status { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            var api_key = "API-Key";
            var template_id = "Template-Key";
            var url = $"https://rest.apitemplate.io/v2/create-image?template_id={template_id}";
            var json_content = @"{
    ""overrides"": [
        {
            ""name"": ""background-color"",
            ""stroke"": ""grey"",
            ""backgroundColor"": ""#FFFFFF""
        },
        {
            ""name"": ""qr_1"",
            ""content"": ""http://ironpdf.com/"",
            ""backgroundColor"": ""white"",
            ""color"": ""#000000""
        }
    ]
}";
            var buffer = System.Text.Encoding.UTF8.GetBytes(json_content);
            var byteContent = new ByteArrayContent(buffer);
            //Console.WriteLine(json_content);
            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("X-API-KEY", api_key);
            var response = await client.PostAsync(url, byteContent);
            var ret = await response.Content.ReadAsStringAsync();
            var returnContent = JsonSerializer.Deserialize<ReturnContent>(ret);
            Console.WriteLine(returnContent.status);
            if (returnContent.status == "success")
            {
                Console.WriteLine($"Downloading {returnContent.download_url}...");
                var download_response = await client.GetAsync(returnContent.download_url);
                using (var stream = await download_response.Content.ReadAsStreamAsync())
                {
                    var fileInfo = new FileInfo(@"F:/QRimage.jpeg");
                    using (var fileStream = fileInfo.OpenWrite())
                    {
                        await stream.CopyToAsync(fileStream);
                    }
                }
            }
        }
    }
}
$vbLabelText   $csharpLabel

APITemplate io和IronPDF比較C# PDF程式庫:圖15

文件和支援

作為一名經常處理PDF生成和操作的C#開發者,我發現文件和支援的質量可以決定一個專案的成敗。 讓我們探索一下我在IronPDF和APITemplate上的文件和支援經歷。

IronPDF

文件

IronPDF的文件全面且結構良好,這在我的專案中起了重大幫助。 以下是我經歷的詳細分解:IronPDF文檔可在https://ironpdf.com/docs/查看,非常全面。這裡有一些我所欣賞的關鍵方面:

  1. 入門指南:文檔以清晰的逐步指南開始,講解如何通過NuGet安裝IronPDF並創建您的第一個PDF。 這幫助我在最初的專案中快速上手。

  2. API引用:API引用非常全面,覆蓋所有類和方法。 每個條目都包含C#示例,這對於我在實現特定功能時非常有用。

  3. 代碼示例:整個文檔中有大量代碼片段和完整示例。 當我需要實現更複雜的PDF操作時,這些非常有幫助。

  4. 教程和使用指南:IronPDF提供了詳細的教程,涵蓋了從HTML創建PDF、添加水印到處理表單等常見任務。 這些教程幫助我通過更高端的使用案例。

  5. 故障排除部分:文檔包含一個故障排除部分,解決常見問題。 當我遇到錯誤或意外行為時,這節省了我不少時間。

支援

IronPDF的聯絡非常有反應,支援渠道在我的體驗中提供了極大的幫助:

  1. 電子郵件支援:當我遇到複雜問題時,我使用他們的電子郵件支援。 回應時間通常在24小時內,支援團隊對產品了解豐富。

  2. 社區論壇:IronPDF 維護一個社區論壇,開發者可以在此提出問題並分享解決方案。 我找到過我的問題答案,也根據自己的經歷貢獻了解決方案。

  3. Stack Overflow: IronPDF 團隊主動監控 Stack Overflow上的 [ironpdf] 標籤。 我在那裡發過的問題收到了一些有幫助的回應。

  4. 定期更新:IronPDF經常發布更新,修正問題並推出新功能。 更新日誌很詳細,幫助我了解每個版本中的新內容或更改。

  5. 遷移指南:當重大版本間存在破壞性更改時,IronPDF提供遷移指南。 這在更新我的專案為程式庫的新版本時至關重要。

APITemplate

APITemplate的文件和支持結構與IronPDF不同,反映了其作為雲端服務的特性。以下是我的經歷:

文件

APITemplate的文件可在https://docs.apitemplate.io/reference/api-reference.html查看,主要專注於API使用。 以下是關鍵要點:

  1. API引用:文件提供了清晰的API引用,詳細介紹了所有可用端點、必要參數和回應格式。 這一直是我將APITemplate整合到我的C#應用程式中的首選資源。

  2. 認證:有一個專門的認證部分,明確解釋如何使用API密鑰。 當我剛開始使用這個服務時,這非常關鍵。

支援

APITemplate的支持結構更注重於電子郵件支持:

  1. 電子郵件支持:當我有問題或疑問時,我使用了他們的電子郵件支持。 回應時間通常在1-2個工作日內。

  2. 常見問題解答部分:文件中包含了一個常見問題解答部分,解決了常見問題。 當我遇到問題時,這經常是我的第一個停留點。

使用IronPDF和Bootstrap 5製作分析儀表板

IronPDF的Chrome V8渲染引擎在呈現現代Bootstrap 5佈局方面表現出色,這使其非常適合生成帶有業務指標和數據可視化的PDF報告。 與APITemplate的基於API的方式不同,IronPDF直接處理HTML,具有完整的CSS3支持,包括flexbox、CSS Grid和自定義屬性。

using IronPdf;

var renderer = new ChromePdfRenderer();

string analyticsDashboard = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .metric-card {
            transition: transform 0.2s;
            border-left: 4px solid #0d6efd;
        }
        .metric-card:hover { transform: translateY(-5px); }
        .trend-up { color: #198754; }
        .trend-down { color: #dc3545; }
        @media print {
            .metric-card { page-break-inside: avoid; }
        }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-5'>
        <div class='row mb-4'>
            <div class='col-12'>
                <div class='card shadow-sm'>
                    <div class='card-body'>
                        <h1 class='display-6 mb-0'>Performance Dashboard</h1>
                        <p class='text-muted mb-0'>Q4 2024 Analytics Overview</p>
                    </div>
                </div>
            </div>
        </div>

        <div class='row g-4 mb-4'>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Total Revenue</h6>
                        <h2 class='display-6 mb-3'>$2.4M</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-success' style='width: 85%'></div>
                        </div>
                        <small class='trend-up'>↑ 18% from last quarter</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Active Users</h6>
                        <h2 class='display-6 mb-3'>48,592</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-primary' style='width: 72%'></div>
                        </div>
                        <small class='trend-up'>↑ 12% growth rate</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Conversion Rate</h6>
                        <h2 class='display-6 mb-3'>3.8%</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-warning' style='width: 38%'></div>
                        </div>
                        <small class='trend-down'>↓ 2% needs attention</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Satisfaction</h6>
                        <h2 class='display-6 mb-3'>4.7/5</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-success' style='width: 94%'></div>
                        </div>
                        <small class='trend-up'>↑ Excellent rating</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm'>
            <div class='card-body'>
                <h5 class='card-title mb-3'>Top Performing Products</h5>
                <div class='table-responsive'>
                    <table class='table table-hover'>
                        <thead class='table-light'>
                            <tr>
                                <th>Product</th>
                                <th>Revenue</th>
                                <th>Units</th>
                                <th>Trend</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>Enterprise Suite</strong></td>
                                <td>$1,240,000</td>
                                <td>2,150</td>
                                <td><span class='badge bg-success'>+22%</span></td>
                            </tr>
                            <tr>
                                <td><strong>Professional Plan</strong></td>
                                <td>$820,000</td>
                                <td>4,890</td>
                                <td><span class='badge bg-success'>+15%</span></td>
                            </tr>
                            <tr>
                                <td><strong>Starter Package</strong></td>
                                <td>$340,000</td>
                                <td>8,240</td>
                                <td><span class='badge bg-warning'>+5%</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(analyticsDashboard);
pdf.SaveAs("analytics-dashboard.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();

string analyticsDashboard = @"
<!DOCTYPE html>
<html>
<head>
    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
    <style>
        .metric-card {
            transition: transform 0.2s;
            border-left: 4px solid #0d6efd;
        }
        .metric-card:hover { transform: translateY(-5px); }
        .trend-up { color: #198754; }
        .trend-down { color: #dc3545; }
        @media print {
            .metric-card { page-break-inside: avoid; }
        }
    </style>
</head>
<body class='bg-light'>
    <div class='container py-5'>
        <div class='row mb-4'>
            <div class='col-12'>
                <div class='card shadow-sm'>
                    <div class='card-body'>
                        <h1 class='display-6 mb-0'>Performance Dashboard</h1>
                        <p class='text-muted mb-0'>Q4 2024 Analytics Overview</p>
                    </div>
                </div>
            </div>
        </div>

        <div class='row g-4 mb-4'>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Total Revenue</h6>
                        <h2 class='display-6 mb-3'>$2.4M</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-success' style='width: 85%'></div>
                        </div>
                        <small class='trend-up'>↑ 18% from last quarter</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Active Users</h6>
                        <h2 class='display-6 mb-3'>48,592</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-primary' style='width: 72%'></div>
                        </div>
                        <small class='trend-up'>↑ 12% growth rate</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Conversion Rate</h6>
                        <h2 class='display-6 mb-3'>3.8%</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-warning' style='width: 38%'></div>
                        </div>
                        <small class='trend-down'>↓ 2% needs attention</small>
                    </div>
                </div>
            </div>
            <div class='col-md-3'>
                <div class='card metric-card shadow-sm h-100'>
                    <div class='card-body'>
                        <h6 class='text-muted text-uppercase mb-2'>Satisfaction</h6>
                        <h2 class='display-6 mb-3'>4.7/5</h2>
                        <div class='progress' style='height: 6px;'>
                            <div class='progress-bar bg-success' style='width: 94%'></div>
                        </div>
                        <small class='trend-up'>↑ Excellent rating</small>
                    </div>
                </div>
            </div>
        </div>

        <div class='card shadow-sm'>
            <div class='card-body'>
                <h5 class='card-title mb-3'>Top Performing Products</h5>
                <div class='table-responsive'>
                    <table class='table table-hover'>
                        <thead class='table-light'>
                            <tr>
                                <th>Product</th>
                                <th>Revenue</th>
                                <th>Units</th>
                                <th>Trend</th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td><strong>Enterprise Suite</strong></td>
                                <td>$1,240,000</td>
                                <td>2,150</td>
                                <td><span class='badge bg-success'>+22%</span></td>
                            </tr>
                            <tr>
                                <td><strong>Professional Plan</strong></td>
                                <td>$820,000</td>
                                <td>4,890</td>
                                <td><span class='badge bg-success'>+15%</span></td>
                            </tr>
                            <tr>
                                <td><strong>Starter Package</strong></td>
                                <td>$340,000</td>
                                <td>8,240</td>
                                <td><span class='badge bg-warning'>+5%</span></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</body>
</html>";

var pdf = renderer.RenderHtmlAsPdf(analyticsDashboard);
pdf.SaveAs("analytics-dashboard.pdf");
$vbLabelText   $csharpLabel

這段代碼生成了一個專業的分析儀表板PDF,包含統計卡、進度條和響應式表格。 IronPDF的Chrome引擎完美地渲染了Bootstrap的flexbox佈局、陰影和懸停效果 - 這些功能需要重大的自訂工作才能在像APITemplate這樣的基於API的服務中做到。

APITemplate的主要優勢:

  • 直接HTML渲染,全面支持Bootstrap
  • 不需要API調用或模板配置
  • 完整的CSS3相容性,包括動畫
  • 離線處理,無需外部依賴

欲了解更多關於Bootstrap PDF生成的信息,請參見HTML到PDF Bootstrap指南

授權

IronPDF的定價與授權

APITemplate io和IronPDF比較C# PDF程式庫:圖16

IronPDF提供多個定價層次,以滿足不同需求:

  1. Lite:定價為$799,適合單位開發者於單個專案中使用。 這是一次性費用,使其成為小型專案或個人開發者的經濟選擇。
  2. Professional:價格為$1,199,這個選擇支持多達10名開發者、10個地點和10個專案。 這一層還包括一次性費用,為中小型團隊提供了更多靈活性。
  3. Unlimited:價格為$2,399,這一層允許不限開發者、地點和專案。 這對大型團隊和需要無限制使用的大型企業非常理想。

IronPDF還為大型組織和需要在商業產品中整合PDF功能的組織提供企業和OEM再分發授權。 它還提供免費試用以供測試。

APITemplate定價與授權

APITemplate提供一種基於API的PDF生成服務。定價通常基於API呼叫次數,這使得它對不同的使用模式更具有靈活性:

  1. 基本計畫:通常從較低的價格點開始,每月有一定數量的API呼叫限制。 這適合小型專案或PDF生成需求不多的小型企業。
  2. 標準計畫:這個計畫包含更多的API呼叫和附加功能,適合中型企業。
  3. 企業計畫:為高用量用戶量身定制,這個計畫提供最多的API呼叫和高級功能,如優先支持和自訂整合。

APITemplate的授權簡單明了,通常與每月或每年的訂閱模式相關。

主要差異

  1. 定價模式:IronPDF使用一次性費用模式,長期來看可能更具成本效益,特別是對於持續、高用量的情況。 另一方面,APITemplate使用基於訂閱的模型,對於用量的彈性和可擴展性更強。
  2. 支援與更新:IronPDF包含了一年的支援與更新,其購買可選擇延長這一期間。 APITemplate的訂閱計畫通常包含持續的支援與更新,作為包的一部分。

為什麼選擇IronPDF?

IronPDF和APITemplate都能夠從HTML內容生成PDF,但IronPDF的實現更強大和靈活。 這裡是比較分析:

IronPDF

using IronPdf;

var renderer = new ChromePdfRenderer();
var html = @"
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; }
        .header { color: #0066cc; font-size: 24px; }
        .content { margin-top: 20px; }
    </style>
</head>
<body>
    <div class='header'>Dynamic Report</div>
    <div class='content'>
        <p>This report was generated on: <script>document.write(new Date().toLocaleString());</script></p>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("IronPDF_report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();
var html = @"
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; }
        .header { color: #0066cc; font-size: 24px; }
        .content { margin-top: 20px; }
    </style>
</head>
<body>
    <div class='header'>Dynamic Report</div>
    <div class='content'>
        <p>This report was generated on: <script>document.write(new Date().toLocaleString());</script></p>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
    </div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("IronPDF_report.pdf");
$vbLabelText   $csharpLabel

APITemplate

using System.Net.Http;
using System.Text.Json;

var apiKey = "your_api_key";
var templateId = "your_template_id";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={templateId}";
var data = new
{
    header = "Dynamic Report",
    content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
    date = DateTime.Now.ToShortDateString()
};
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", apiKey);
var response = await client.PostAsync(url, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("APITemplate_report.pdf", pdfBytes);
using System.Net.Http;
using System.Text.Json;

var apiKey = "your_api_key";
var templateId = "your_template_id";
var url = $"https://rest.apitemplate.io/v2/create-pdf?template_id={templateId}";
var data = new
{
    header = "Dynamic Report",
    content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
    date = DateTime.Now.ToShortDateString()
};
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("X-API-KEY", apiKey);
var response = await client.PostAsync(url, content);
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
File.WriteAllBytes("APITemplate_report.pdf", pdfBytes);
$vbLabelText   $csharpLabel

主要差異

  1. JavaScript支持:IronPDF在HTML中完全支持JavaScript執行,允許動態內容生成(如範例中的當前日期)。 APITemplate通常要求事先提供所有數據。
  2. CSS靈活性:使用IronPDF,您可以直接在HTML中完全控制CSS樣式。 APITemplate經常需要預定義的模板,具有有限自訂選項。
  3. 性能:IronPDF在本地處理HTML,對於複雜的文檔生成速度更快。 APITemplate的雲基礎可能引入延遲。
  4. 離線功能:IronPDF可離線工作,這對於有限互聯網連接或高安全需求的應用都很有用。 APITemplate始終需要互聯網連接。
  5. 動態內容:IronPDF允許動態生成即時內容,而APITemplate通常需要一個預定義的模板結構。
  6. 自訂性:IronPDF在PDF生成過程中提供了更細緻的控制,包括頁面大小、邊距和其他PDF特定設置選項。
  7. 一致性:IronPDF確保跨不同環境的渲染一致性,因為它使用自己的渲染引擎。APITemplate的輸出可能會因其服務器配置而有所不同。

結論

在各種C#專案中廣泛使用IronPDF和APITemplate之後,我開始欣賞每個工具的獨特優勢。 然而,對於我的大多數與PDF相關的任務,IronPDF始終被證明是更優的選擇。雖然APITemplate有其優勢,特別是對於簡單的基於模板的文件生成,我發現IronPDF的多樣性使它能夠同樣有效地處理這些任務,同時也在需要時提供處理更複雜的PDF操作的能力。

總而言之,雖然兩個工具各有其用處,但IronPDF始終證明是C#開發中PDF操作的更強大、更靈活和更具成本效益的解決方案。 其強大的功能集、優秀的性能和全面的支持使它成為我的任何PDF相關任務的首選選擇,從最簡單的文件生成到最複雜的PDF操作。

請注意APITemplate是其各自所有者的註冊商標。 本網站與APITemplate沒有隸屬關係,未獲其認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,並反映了撰寫本文時的公開信息。)}]

常見問題解答

雲端工具和庫工具之間的 PDF 生成工具有何主要差異?

像 APITemplate 這樣的雲端工具通過 API 調用生成 PDF,需要互聯網連接。與此相反,像 IronPDF 這樣的庫工具集成在你的 C# 應用中,允許離線 PDF 操作並提供更多的 PDF 創建和自定義控制。

IronPDF 如何在 C# 應用程序中處理 HTML 到 PDF 的轉換?

IronPDF 允許使用像 RenderHtmlAsPdf 這樣的方法無縫地將 HTML 轉換為 PDF。它完全支持包括 CSS 和 JavaScript 在內的現代網頁標準,確保將網頁內容高質量地呈現在 PDF 中。

我可以使用 IronPDF 來生成 PDF 中的動態內容嗎?

是的,IronPDF 支持 JavaScript 的執行,這讓 PDF 中的動態內容生成成為可能。這在直接從具有動態數據的網頁創建交互式 PDF 時特別有用。

使用 IronPDF 比訂閱服務有什麼優勢?

IronPDF 提供一次性授權費,是一種實惠的長期使用解決方案。它允許離線操作,並提供廣泛的 PDF 操作功能,這可能比像 APITemplate 這樣的訂閱服務更靈活和強大。

IronPDF 為開發人員提供了什麼支持?

IronPDF 通過詳細的文檔提供全面支持,包括指南、API 參考和代碼示例。開發人員還可以通過電子郵件支持、社區論壇以及在 Stack Overflow 等平台上進行監控來尋求幫助。

IronPDF 是否支持跨平台開發?

是的,IronPDF 與 .NET Standard 兼容,支持跨平台開發。這確保了開發人員可以無縫地將 IronPDF 集成到運行於不同操作系統的項目中。

IronPDF 如何確保生成的 PDF 的安全性?

IronPDF 包括 PDF 加密和解密功能,允許開發人員使用密碼和數字簽名來保護文檔。這些功能有助於維護 PDF 文檔的機密性和完整性。

使用 IronPDF 有哪些常見的故障排除提示?

當遇到 IronPDF 的問題時,確保所有依賴項均已正確安裝和更新。檢查文檔以了解兼容性和配置設置,並查看示例代碼以驗證實施方法。如果問題依然存在,支持團隊將提供幫助。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me