該頁面可以包含自動翻譯的文字。
使用 C# 和 VB.NET 渲染和列印 PDF 文檔
說到閱讀 PDF 文檔,每個人都會想到 Adobe Reader。 但是,如果您是軟體開發人員並且想要在應用程式中顯 示 PDF 文件該怎麼辦? 您不想要求使用者設定 Adobe Reader 並在其中開啟文件。
您可能還需要實現其他與 PDF 相關的要求。 例如,列印 PDF 文件。 或為上傳的 PDF 文件產生縮圖。 或支援 在桌面或 Web 應用程式中編輯 PDF。
您所需要的只是一個可以渲染和列印 PDF 文件的 PDF 庫。
用於檢視、編輯或列印 PDF 文件的 .NET 函式庫
Docotic.Pdf 庫 允許您在 C# 和 VB.NET 中顯示、編輯和列印 PDF 文件。 您可以使用三 個核心功能來實現任何複雜的 PDF 渲染流程。
第一個是將 PDF 轉換為映像 的功能。 您可以基於此功能實現幾乎所有內容。 從 PDF 列印到在 HoloLense 上顯示 PDF 或在 Instagram 上發布 PDF。 這是可能的,因為到處都支援圖像。
第二個關鍵功能是能夠在 System.Drawing.Graphics
的繪圖面上繪製 PDF 頁面。 它允許您在 Windows 窗體
或 WPF 應用程式中渲染和列印 PDF。 若要使用此功能,請將 BitMiracle.Docotic.Pdf.Gdi 擴充
DLL 新增至您的專案中。
最後但並非最不重要的是提取 PDF 頁面物件的能力。 此功能可讓您在 C# 或 VB.NET 應用程式中建立 PDF 檢視 器或 PDF 編輯器。
9.5.17615-dev 14,813 已通過 NuGet 總下載量 4,924,084在 下載 C# .NET PDF 函式庫 頁面取得該資料庫和免費的限時許可證金鑰。
在 Windows 窗體或 WPF 應用程式中列印 PDF
.NET 不支援直接列印 PDF 文件。 您需要將 PDF 文件轉換為影像、XPS 文件,或將其繪製到
System.Drawing.Graphics
表面。 然後,您可以使用 .NET 類別從 Windows 窗體或 WPF 應用程式列印輸出。
在 Windows 窗體應用程式中,您可以使用 System.Drawing.Printing
命名空間中的類別。 還有方便的
PrintDialog
和 PrintPreviewDialog
類別用於建立列印 UI。
請注意,不建議在 macOS 和 Linux 環境中使用 System.Drawing
命名空間中的任何內容。 System.Drawing
的 macOS 和 Linux 實作不完整且與 Windows 實作不同。 如果您在 macOS 和 Linux 環境中使用
System.Drawing
命名空間,您可能會得到不正確和/或不一致的結果。
WPF 提供了另一個 PrintDialog
類,但不提供用於列印預覽的類別。 幸運的是,WPF 允許您使用
System.Windows.Forms.dll 中的 PrintPreviewDialog
類別。 因此,在 WPF 應用程式中使用
System.Windows.Forms
和 System.Drawing.Printing
命名空間中的列印類別會更容易。
查看 在 .NET 中列印 PDF 演示應用程序,該應用程式採用適用於 WinForms 和 WPF 的 C# 和 VB.NET 版本。 該應用程式展示如何:
- 顯示 PDF 文件的列印預覽
- 將 PDF 文件列印到選定的印表機
- 設定紙張尺寸、縮放模式和其他列印設置
該應用程式使用Docotic.Pdf 庫、BitMiracle.Docotic.Pdf.Gdi 擴展DLL 以及來自
System.Windows.Forms
和 System.Drawing.Printing
命名空間的列印類別。 您可以在 WPF 或 Windows 表
單專案中使用其 PdfPrintDocument 和
PdfPrintHelper 類別。
PdfPrintDocument
類別描述了主要的列印邏輯。 此類別將 Docotic.Pdf 與
System.Drawing.Printing.PrintDocument
類別連接起來。 關鍵方法是 printDocument_PrintPage
事件處
理程序:
private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
{
Graphics gr = e.Graphics;
// 以點為單位進行工作,以便為所有上下文提供一致的單位:
// 1. 印表機
// 2. 列印預覽
// 3. PDF
gr.PageUnit = GraphicsUnit.Point;
if (m_printAction == PrintAction.PrintToPreview)
{
gr.Clear(Color.LightGray);
gr.FillRectangle(Brushes.White, m_printableAreaInPoints);
gr.IntersectClip(m_printableAreaInPoints);
gr.TranslateTransform(m_printableAreaInPoints.X, m_printableAreaInPoints.Y);
}
PdfPage page = m_pdf.Pages[m_pageIndex];
PdfSize pageSizeInPoints = getPageSizeInPoints(page);
if (m_printSize == PrintSize.FitPage)
{
float sx = (float)(m_printableAreaInPoints.Width / pageSizeInPoints.Width);
float sy = (float)(m_printableAreaInPoints.Height / pageSizeInPoints.Height);
float scaleFactor = Math.Min(sx, sy);
centerContentInPrintableArea(gr, pageSizeInPoints, scaleFactor);
gr.ScaleTransform(scaleFactor, scaleFactor);
}
else if (m_printSize == PrintSize.ActualSize)
{
centerContentInPrintableArea(gr, pageSizeInPoints, 1);
}
page.Draw(gr);
++m_pageIndex;
e.HasMorePages = (m_pageIndex <= m_lastPageIndex);
}
首先,我們設定列印頁面的 Graphics
物件的轉換。 尊重“適合頁面”和“實際尺寸”設定非常重要。 我們也在
「列印預覽」對話方塊中顯示印表機的硬邊距。 然後我們使用
PdfPage.Draw 擴充功能在 Graphics
物件上繪製目前
PDF 頁面。
PdfPrintHelper
類別可讓您將 PdfPrintDocument
與 UI 類別一起使用進行列印。 例如,您可以顯示 PDF
文件的列印對話框,如下所示:
using (var pdf = new PdfDocument("your_document.pdf"))
action(pdf, getPrintSize());
public static DialogResult ShowPrintDialog(PdfDocument pdf, PrintSize printSize)
{
using (var printDialog = new PrintDialog())
{
printDialog.AllowSomePages = true;
printDialog.AllowCurrentPage = true;
printDialog.AllowSelection = true;
printDialog.PrinterSettings.MinimumPage = 1;
printDialog.PrinterSettings.MaximumPage = pdf.PageCount;
printDialog.PrinterSettings.FromPage = printDialog.PrinterSettings.MinimumPage;
printDialog.PrinterSettings.ToPage = printDialog.PrinterSettings.MaximumPage;
var result = printDialog.ShowDialog();
if (result == DialogResult.OK)
{
using (var printDocument = new PdfPrintDocument(pdf, printSize))
printDocument.Print(printDialog.PrinterSettings);
}
return result;
}
}
就是這樣。 執行下列操作以在 Windows 窗體或 WPF 應用程式中實作 PDF 列印:
- 新增範例的
PdfPrintDocument
、PdfPrintHelper
和PrintSize
文件 - 新增對 Docotic.Pdf 庫的引用
- 新增 BitMiracle.Docotic.Pdf.Gdi 擴充 DLL 的引用 *(僅限 WPF)新增 System.Windows.Forms 和 System.Drawing 組件的引用
使用轉換為圖像列印 PDF
System.Drawing.Printing
命名空間中的類別在 Windows 窗體和 WPF 應用程式中運作良好。 但是,在某些情
況下您不能或不應該使用 System.Drawing.Printing
。
例如,您不應在 Windows 服務或 ASP.NET 應用程式中使用 System.Drawing.Printing
。 在 Linux 或 macOS
上列印時,System.Drawing.Printing
可能會產生不一致的結果。 而且您不能在 Eto.Forms 或 Avalonia 應
用程式中使用 System.Drawing.Printing
。
在這種情況下,您需要先將PDF文件轉換為映像。 此 C# 範例示範如何將 PDF 頁面儲存為 PNG 映像或將整個 PDF 文件轉換為多頁 TIFF:
using (var pdf = new PdfDocument(@"your_document.pdf"))
{
PdfDrawOptions options = PdfDrawOptions.Create();
options.HorizontalResolution = printerDpi;
options.VerticalResolution = printerDpi;
// 儲存一頁
pdf.Pages[0].Save("page0.png", options);
// 將整份文件儲存為多頁黑白 TIFF
options.Compression = ImageCompressionOptions.CreateTiff().SetBitonal();
pdf.SaveAsTiff("your_document.tiff", options);
}
然後,使用替代列印框架或工具列印影像。 查看 在 Eto.Forms 中列印 PDF 演示應
用程序,該應用程式展示如何在沒有 System.Drawing.Printing
的情況下列印 PDF 文件。
在 C# 和 VB.NET 中渲染 PDF
在應用程式中顯示 PDF 就像列印一樣。 在 ASP.NET、WPF、Eto.Forms、Avalonia 或任何其他應用程式類型 中,將 PDF 轉換為圖像,然後顯示圖像。
在 Windows 窗體應用程式中,您可以從任何控制項的 System.Drawing.Graphics
上下文中繪製 PDF 頁面。或
者,您可以將 PDF 頁面轉換為 System.Drawing.Bitmap
,然後在 PictureBox
中顯示該點陣圖。
此範例展示如何在 C# 中將 PDF 頁面轉換為 Bitmap
:
using (var pdf = new PdfDocument("render.pdf"))
{
const float TargetResolution = 300;
PdfPage page = pdf.Pages[0];
double scaleFactor = TargetResolution / page.Resolution;
using (var bitmap = new Bitmap((int)(page.Width * scaleFactor), (int)(page.Height * scaleFactor)))
{
bitmap.SetResolution(TargetResolution, TargetResolution);
using (Graphics gr = Graphics.FromImage(bitmap))
page.Draw(gr);
bitmap.Save("result.png");
}
}
上面的程式碼需要您將 BitMiracle.Docotic.Pdf.Gdi 擴充 DLL 新增到您的專案中。
在.NET應用程式中建立PDF檢視器或PDF編輯器
Docotic.Pdf 可讓您取得 PDF 頁面上每個物件的詳細資訊。 您可以從 PDF 頁面中提取文字區塊、圖像、向量路 徑、表單控制項和註解。
然後在您的應用程式中,您可以渲染所有提取的物件。 您還可以實現選擇和編輯渲染物件的功能。
查看從 PDF 中提取文字、圖像和路徑 範例。 它展示瞭如何提取頁面物件並將其
繪製到 System.Drawing.Graphics
上下文中。
您也可以將文字物件提取為向量路徑。 使用 PdfPage.GetObjects(PdfObjectExtractionOptions) 重載。
結論
使用 Docotic.Pdf 庫 在 .NET 專案中顯示和列印 PDF 文件。 查看相關的 C# 和 VB.NET 範例:
如果您對 PDF 列印或渲染有疑問,請聯絡我們。