ASP PDF 庫:比較 IronPDF、Aspose 和 Syncfusion
Ghostscript GPL與IronPDF:針對.NET開發者的技術比較
當.NET開發者評估PDF處理解決方案時,Ghostscript GPL常以其悠久的歷史成為一個值得尊敬的PostScript和PDF解釋器。 然而,其AGPL許可限制、需要進程生成的命令列介面,以及外部二進制依賴,促使許多團隊評估其他替代方案。 IronPDF提供了一種本機.NET方法,具有型別化的API、通過Chromium進行內建的HTML到PDF轉換,以及自包含的NuGet部署。
此比較檢視了這兩個工具在技術上相關的各種面向,以幫助專業開發者和架構師做出有知識的.NET PDF需求決策。
了解Ghostscript GPL
Ghostscript GPL是一個開源的PostScript和PDF解釋器,在AGPL許可下可用。 其轉換、渲染和管理PDF文件的能力來源於多年的開發,使其成為成熟而可靠的後端PDF處理解決方案。
Ghostscript基本上是一個命令列工具。 從C#使用它需要通過-dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=...這樣的字串開關,並解析輸出或stderr中的錯誤。 此程式庫使用gsdll64.dll)
對PDF進行圖像轉換,GetPage()方法,使用1索引頁碼。 每次操作都需要管理外部Ghostscript二進制安裝、PATH配置,以及部署環境中的版本相容性。
了解IronPDF
IronPDF是一個本機的.NET PDF程式庫,通過型別化且支援IntelliSense的API與C#應用程式無縫整合。 該程式庫使用內建的Chromium引擎進行HTML到PDF的轉換,支援JavaScript、CSS和HTML5,以精確呈現網頁內容。
IronPDF使用RenderHtmlAsPdf()直接接收HTML字串。 針對現有的PDFs,SaveAs()等PDF操作方法。 該程式庫以自包含的NuGet包形式部署,無需外部二進制依賴。
架構與整合比較
這些工具之間的根本區別在於它們與.NET應用程式的整合方法。
| Aspect | Ghostscript GPL | IronPDF |
|---|---|---|
| 許可證 | AGPL(傳染性)或昂貴的商用 | 商業許可,條款明確 |
| 整合 | 命令列進程生成 | 本機.NET程式庫 |
| API設計 | 基於字串的開關 | 型別化、支援IntelliSense的API |
| 錯誤處理 | 解析stderr文字 | .NET異常 |
| HTML-to-PDF | 不支援(需要外部工具) | 內建的Chromium引擎 |
| 依賴 | 外部二進制安裝 | 自包含的NuGet包 |
| 部署 | 配置PATH,複製DLLs | 只需新增NuGet引用 |
| 執行緒安全性 | 只有進程隔離 | 設計為執行緒安全 |
| 現代.NET | 支援有限 | 全面支援.NET 6/7/8 |
| 異步支持 | 基於進程 | 本地async/await |
這種範式轉變意義重大:
Ghostscript GPL: "Pass these string switches to external process"
IronPDF: "Call these methods on .NET objects"
Ghostscript GPL的AGPL許可證要求如果您分發使用它的軟體,您必須公開您的源程式碼,除非您從Artifex購買昂貴的商業許可證。 這種許可的複雜性對商業應用來說是一個主要考慮因素。
程式碼比較:常見的PDF操作
HTML到PDF轉換
此操作演示了這兩種方法之間的核心架構差異。
Ghostscript GPL:
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.IO;
using System.Text;
class GhostscriptExample
{
static void Main()
{
// Ghostscript cannot directly convert HTML to PDF
// You need to first convert HTML to PS/EPS using another tool
// then use Ghostscript to convert PS to PDF
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
string psFile = "temp.ps";
string outputPdf = "output.pdf";
// This is a workaround - Ghostscript primarily works with PostScript
GhostscriptProcessor processor = new GhostscriptProcessor();
List<string> switches = new List<string>
{
"-dNOPAUSE",
"-dBATCH",
"-dSAFER",
"-sDEVICE=pdfwrite",
$"-sOutputFile={outputPdf}",
psFile
};
processor.Process(switches.ToArray());
}
}
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.IO;
using System.Text;
class GhostscriptExample
{
static void Main()
{
// Ghostscript cannot directly convert HTML to PDF
// You need to first convert HTML to PS/EPS using another tool
// then use Ghostscript to convert PS to PDF
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
string psFile = "temp.ps";
string outputPdf = "output.pdf";
// This is a workaround - Ghostscript primarily works with PostScript
GhostscriptProcessor processor = new GhostscriptProcessor();
List<string> switches = new List<string>
{
"-dNOPAUSE",
"-dBATCH",
"-dSAFER",
"-sDEVICE=pdfwrite",
$"-sOutputFile={outputPdf}",
psFile
};
processor.Process(switches.ToArray());
}
}
Imports Ghostscript.NET
Imports Ghostscript.NET.Processor
Imports System.IO
Imports System.Text
Class GhostscriptExample
Shared Sub Main()
' Ghostscript cannot directly convert HTML to PDF
' You need to first convert HTML to PS/EPS using another tool
' then use Ghostscript to convert PS to PDF
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
Dim psFile As String = "temp.ps"
Dim outputPdf As String = "output.pdf"
' This is a workaround - Ghostscript primarily works with PostScript
Dim processor As New GhostscriptProcessor()
Dim switches As New List(Of String) From {
"-dNOPAUSE",
"-dBATCH",
"-dSAFER",
"-sDEVICE=pdfwrite",
$"-sOutputFile={outputPdf}",
psFile
}
processor.Process(switches.ToArray())
End Sub
End Class
IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
class IronPdfExample
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class IronPdfExample
{
static void Main()
{
var renderer = new ChromePdfRenderer();
string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class IronPdfExample
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class
程式碼註釋明確指出Ghostscript GPL不能直接將HTML轉換為PDF。 您需要首先使用其他工具將HTML轉換為PostScript,然後使用Ghostscript GPL將PostScript轉換為PDF。 此多步驟的管道增加了複雜性,需要額外的外部工具。
IronPDF建立一個SaveAs()保存。 內建的Chromium引擎渲染HTML,全面支持CSS、JavaScript和HTML5。
如需進階HTML渲染選項,請查看HTML到PDF轉換指南。
PDF到圖像轉換
將PDF頁面轉換為圖像演示了光柵化工作流程的差異。
Ghostscript GPL:
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Rasterizer;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
class GhostscriptExample
{
static void Main()
{
string inputPdf = "input.pdf";
string outputPath = "output";
GhostscriptVersionInfo gvi = new GhostscriptVersionInfo("gsdll64.dll");
using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
{
rasterizer.Open(inputPdf, gvi, false);
for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
{
Image img = rasterizer.GetPage(300, pageNumber);
img.Save($"{outputPath}_page{pageNumber}.png", ImageFormat.Png);
img.Dispose();
}
}
}
}
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Rasterizer;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
class GhostscriptExample
{
static void Main()
{
string inputPdf = "input.pdf";
string outputPath = "output";
GhostscriptVersionInfo gvi = new GhostscriptVersionInfo("gsdll64.dll");
using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
{
rasterizer.Open(inputPdf, gvi, false);
for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
{
Image img = rasterizer.GetPage(300, pageNumber);
img.Save($"{outputPath}_page{pageNumber}.png", ImageFormat.Png);
img.Dispose();
}
}
}
}
Imports Ghostscript.NET
Imports Ghostscript.NET.Rasterizer
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.IO
Class GhostscriptExample
Shared Sub Main()
Dim inputPdf As String = "input.pdf"
Dim outputPath As String = "output"
Dim gvi As New GhostscriptVersionInfo("gsdll64.dll")
Using rasterizer As New GhostscriptRasterizer()
rasterizer.Open(inputPdf, gvi, False)
For pageNumber As Integer = 1 To rasterizer.PageCount
Dim img As Image = rasterizer.GetPage(300, pageNumber)
img.Save($"{outputPath}_page{pageNumber}.png", ImageFormat.Png)
img.Dispose()
Next
End Using
End Sub
End Class
IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfExample
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
var images = pdf.ToBitmap();
for (int i = 0; i < images.Length; i++)
{
images[i].Save($"output_page{i + 1}.png");
}
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class IronPdfExample
{
static void Main()
{
var pdf = PdfDocument.FromFile("input.pdf");
var images = pdf.ToBitmap();
for (int i = 0; i < images.Length; i++)
{
images[i].Save($"output_page{i + 1}.png");
}
}
}
Imports IronPdf
Imports System
Class IronPdfExample
Shared Sub Main()
Dim pdf = PdfDocument.FromFile("input.pdf")
Dim images = pdf.ToBitmap()
For i As Integer = 0 To images.Length - 1
images(i).Save($"output_page{i + 1}.png")
Next
End Sub
End Class
Ghostscript GPL需要建立一個rasterizer.GetPage(dpi, pageNumber) 迭代迴圈通過1索引的頁面。 每張圖像必須明確處置。
IronPDF使用PdfDocument.FromFile() 載入PDF,一次性調用ToBitmap() 以便獲得所有頁面圖像,然後使用標準0索引迴圈進行迭代。 無需外部DLL引用或版本資訊。
合併多個PDF
PDF合併演示了命令列開關模式與型別化API方法。
Ghostscript GPL:
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.Collections.Generic;
class GhostscriptExample
{
static void Main()
{
string outputPdf = "merged.pdf";
string[] inputFiles = { "file1.pdf", "file2.pdf", "file3.pdf" };
GhostscriptProcessor processor = new GhostscriptProcessor();
List<string> switches = new List<string>
{
"-dNOPAUSE",
"-dBATCH",
"-dSAFER",
"-sDEVICE=pdfwrite",
$"-sOutputFile={outputPdf}"
};
switches.AddRange(inputFiles);
processor.Process(switches.ToArray());
}
}
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.Collections.Generic;
class GhostscriptExample
{
static void Main()
{
string outputPdf = "merged.pdf";
string[] inputFiles = { "file1.pdf", "file2.pdf", "file3.pdf" };
GhostscriptProcessor processor = new GhostscriptProcessor();
List<string> switches = new List<string>
{
"-dNOPAUSE",
"-dBATCH",
"-dSAFER",
"-sDEVICE=pdfwrite",
$"-sOutputFile={outputPdf}"
};
switches.AddRange(inputFiles);
processor.Process(switches.ToArray());
}
}
Imports Ghostscript.NET
Imports Ghostscript.NET.Processor
Imports System.Collections.Generic
Class GhostscriptExample
Shared Sub Main()
Dim outputPdf As String = "merged.pdf"
Dim inputFiles As String() = {"file1.pdf", "file2.pdf", "file3.pdf"}
Dim processor As New GhostscriptProcessor()
Dim switches As New List(Of String) From {
"-dNOPAUSE",
"-dBATCH",
"-dSAFER",
"-sDEVICE=pdfwrite",
$"-sOutputFile={outputPdf}"
}
switches.AddRange(inputFiles)
processor.Process(switches.ToArray())
End Sub
End Class
IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class IronPdfExample
{
static void Main()
{
var pdfs = new List<PdfDocument>
{
PdfDocument.FromFile("file1.pdf"),
PdfDocument.FromFile("file2.pdf"),
PdfDocument.FromFile("file3.pdf")
};
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;
class IronPdfExample
{
static void Main()
{
var pdfs = new List<PdfDocument>
{
PdfDocument.FromFile("file1.pdf"),
PdfDocument.FromFile("file2.pdf"),
PdfDocument.FromFile("file3.pdf")
};
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Imports System.Collections.Generic
Class IronPdfExample
Shared Sub Main()
Dim pdfs As New List(Of PdfDocument) From {
PdfDocument.FromFile("file1.pdf"),
PdfDocument.FromFile("file2.pdf"),
PdfDocument.FromFile("file3.pdf")
}
Dim merged = PdfDocument.Merge(pdfs)
merged.SaveAs("merged.pdf")
End Sub
End Class
Ghostscript GPL需要生成一個字串開關列表(processor.Process()。 隱晦的開關語法需要記錄且無IntelliSense支持。
IronPDF使用PdfDocument.FromFile() 載入每個PDF,建立文件列表,並調用靜態PdfDocument.Merge() 方法。 型別化API提供了IntelliSense和編譯時檢查。
了解更多有關PDF操作的資訊,請查看IronPDF教程。
API和開關映射參考
對於評估Ghostscript GPL遷移或比較功能的開發者,這個映射顯示了等效操作:
核心類映射
| Ghostscript GPL | IronPDF |
|---|---|
GhostscriptProcessor |
PdfDocument 方法 |
GhostscriptRasterizer |
pdf.ToBitmap() / RasterizeToImageFiles() |
GhostscriptVersionInfo |
N/A(不需要) |
GhostscriptStdIO |
N/A(使用異常) |
| 進程+命令列 | ChromePdfRenderer |
命令列開關映射
| Ghostscript GPL開關 | IronPDF等效項 | 描述 |
|---|---|---|
-dNOPAUSE |
N/A(不需要) | 頁面之間不要暫停 |
-dBATCH |
N/A(不需要) | 處理後退出 |
-dSAFER |
不適用(預設) | 安全文件存取 |
-sDEVICE=pdfwrite |
多種PDF方法 | 輸出PDF |
-sDEVICE=png16m |
RasterizeToImageFiles("*.png") |
PNG輸出 |
-sDEVICE=jpeg |
RasterizeToImageFiles("*.jpg") |
JPEG輸出 |
-sOutputFile=X |
SaveAs("X") |
輸出文件名 |
-r300 |
方法中的DPI參數 | 解析度 |
-dPDFSETTINGS=/screen |
CompressImages(quality: 50) |
低品質壓縮 |
-dPDFSETTINGS=/ebook |
CompressImages(quality: 75) |
中等品質壓縮 |
-dFirstPage=N |
CopyPages(N-1, ...) |
起始頁(1索引轉為0索引) |
-sOwnerPassword=X |
pdf.SecuritySettings.OwnerPassword = "X" |
加密 |
-sUserPassword=X |
pdf.SecuritySettings.UserPassword = "X" |
密碼保護 |
頁碼索引差異
一個重要差異是頁碼索引:
// Ghostscript GPL: 1-indexed pages
for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
{
Image img = rasterizer.GetPage(300, pageNumber);
}
// IronPDF: 0-indexed pages (standard .NET)
for (int i = 0; i < images.Length; i++)
{
images[i].Save($"output_page{i + 1}.png");
}
// Ghostscript GPL: 1-indexed pages
for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
{
Image img = rasterizer.GetPage(300, pageNumber);
}
// IronPDF: 0-indexed pages (standard .NET)
for (int i = 0; i < images.Length; i++)
{
images[i].Save($"output_page{i + 1}.png");
}
Option Strict On
' Ghostscript GPL: 1-indexed pages
For pageNumber As Integer = 1 To rasterizer.PageCount
Dim img As Image = rasterizer.GetPage(300, pageNumber)
Next
' IronPDF: 0-indexed pages (standard .NET)
For i As Integer = 0 To images.Length - 1
images(i).Save($"output_page{i + 1}.png")
Next
Ghostscript GPL使用1索引頁碼(CopyPages(4))。
遷移複雜度評估
| 功能 | 遷移複雜度 |
|---|---|
| PDF到圖像 | 低 |
| 合併PDFs | 低 |
| 壓縮PDF | 低 |
| PostScript到PDF | 中 |
| PDF優化 | 低 |
| 加密 | 中 |
| PDF/A轉換 | 低 |
| 自定義開關 | 中高 |
功能比較摘要
| 功能 | Ghostscript GPL | IronPDF |
|---|---|---|
| HTML-to-PDF | ❌(需要外部工具) | ✅(內建的Chromium) |
| PDF到圖像 | ✅(GhostscriptRasterizer) | ✅(ToBitmap) |
| 合併PDFs | ✅(命令列開關) | ✅(靜態Merge) |
| 本機.NET API | ❌(進程生成) | ✅ |
| IntelliSense支持 | ❌(字串開關) | ✅ |
| 異常處理 | ❌(stderr解析) | ✅ |
| 外部二進制 | ✅(gsdll*.dll需要) | ❌ |
| AGPL許可 | ✅(需要公開源碼) | ❌ |
| 異步支持 | ❌(基於進程) | ✅(本地async/await) |
| 執行緒安全 | 只有進程隔離 | ✅(根據設計) |
何時團隊考慮從Ghostscript GPL轉向IronPDF
開發團隊評估從Ghostscript GPL轉向IronPDF的原因有多個:
AGPL許可限制: Ghostscript GPL的AGPL許可以要求如果您分發使用它的軟體,您必須公開您的源程式碼,除非您從Artifex購買昂貴的商業許可。 這對於專有應用來說是一個重要考量。
命令列介面複雜性:Ghostscript GPL 本質上是一個命令列工具。 從C#使用它需要生成進程、傳遞字串參數並解析輸出,這是一個脆弱且易出錯的方法。 沒有IntelliSense、沒有型別安全,並且錯誤是通過stderr以需解析的文字字串傳遞。
無本地HTML到PDF:Ghostscript GPL不能直接將HTML轉換爲PDF。 您需要一個多步驟管道,使用外部工具先將HTML轉換爲PostScript,然後使用Ghostscript GPL將PostScript轉換爲PDF。 IronPDF的內建Chromium引擎可以直接處理HTML/CSS/JavaScript。
外部二進製管理:您必須單獨安裝Ghostscript GPL,管理PATH變數,並確保在各個部署環境中的版本相容性。 不同的DLL對於32位和64位(gsdll64.dll)需要仔細的部署配置。 IronPDF以自包含的NuGet包形式部署。
進程管理開銷:每個Ghostscript GPL操作生成一個獨立的進程,增加了錯誤處理,超時和資源清理的複雜性。IronPDF提供本地.NET方法,具有標準異常處理功能。
隱晦的開關語法:操作通過像-dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=...這樣的開關控制,需要記憶且無編譯時檢查。
優勢和考量因素
Ghostscript GPL的優勢
- 功能豐富:提供一個全面的套件用於處理,轉換,渲染和查看PDF
- 成熟而可靠:多年的開發,擁有強大的社區
- PostScript支持:本地化PostScript解釋
Ghostscript GPL的考量因素
- AGPL許可:需要公開源程式碼,除非購買商業許可
- 命令列整合:需要從C#生成進程
- 無HTML-to-PDF:需要外部工具
- 外部二進製:需要DLL管理與PATH配置
- 特定平台的DLL:涉及32位與64位的考量
- 基於字串的API:無IntelliSense,無型別安全
IronPDF的優勢
IronPDF的考量因素
- 不支援PostScript:首先轉換為PDF或使用HTML
- 商業許可:生產使用需要
結論
Ghostscript GPL和IronPDF表示對.NET中的PDF處理的根本不同的的思想方法。 Ghostscript GPL的命令行傳統意味着整合需要進程生成、基於字串的開關和外部二進制管理。 其AGPL許可要求對於分發應用的源程式碼公開,除非購買商業許可。
IronPDF提供了本機的.NET替代品,具有型別化API、IntelliSense支持、內建的Chromium HTML到PDF,以及自包含的NuGet部署。 該程式庫消除了進程生成、外部二進制依賴、和隱晦的開關語法。
隨著組織為.NET 10,C# 14及至2026年的應用開發規劃,命令列工具整合和本機.NET程式庫的選擇將顯著影響開發速度和部署的複雜性。 尋求現代.NET模式、HTML-to-PDF能力和簡化許可的團隊會發現IronPDF能有效地解決這些優先事項。
開始評估IronPDF,提供免費試用,並查看詳盡的文件以評估是否符合您的具體要求。
常見問題
Ghostscript GPL 和 IronPDF 之間的主要差異是什麼?
Ghostscript GPL 是一個免費、開源的工具,使用命令行開關,而 IronPDF 提供原生 .NET API,為 .NET 開發者帶來更綜合的體驗。
Ghostscript GPL 的授權與 IronPDF 有何不同?
Ghostscript GPL 是在 AGPL 授權下發佈,要求分享修改,而 IronPDF 提供商業授權,允許封閉源碼項目。
IronPDF 可以將 HTML 轉換成 PDF 嗎?
是的,IronPDF 擁有強大的 HTML 到 PDF 轉換能力,能夠在 .NET 應用程式中準確地呈現複雜的網頁。
Ghostscript GPL 適合 .NET 開發者使用嗎?
儘管 Ghostscript GPL 可以被 .NET 開發者使用,但相比於專為 .NET 環境設計的 IronPDF,它可能需要額外的整合努力。
IronPDF 是否支持 PDF 編輯功能?
是的,IronPDF 支持多樣的 PDF 編輯功能,比如合併、拆分和新增註釋,這些功能可以在 .NET 項目中輕鬆實現。
使用像 IronPDF 這樣的原生 .NET API 有何優勢?
像 IronPDF 這樣的原生 .NET API 提供無縫整合、更好的性能,以及在 .NET 應用程式中更好的可維護性,相比於像 Ghostscript 這樣的命令行工具。
using IronPDF 有哪些性能考量?
IronPDF 已優化其在 .NET 應用程式中的性能,提供快速的 PDF 生成和處理能力,適合於高要求的環境。
IronPDF 可以在開發和生產環境中使用嗎?
是的,IronPDF 設計用於開發和生產環境中,提供可靠且一致的 PDF 生成功能給 .NET 應用程式。
IronPDF 使用者的支援可用性如何?
IronPDF 為其使用者提供專門的支援,確保開發者在將 PDF 功能整合到他們的 .NET 項目時得到幫助和指導。
IronPDF 如何處理 PDF 安全性?
IronPDF 提供用於保護 PDF 的功能,例如密碼保護和數位簽名,確保敏感資訊受到保護。




