該頁面可以包含自動翻譯的文字。

使用 C# 和 VB.NET 渲染和列印 PDF 文檔

說到閱讀 PDF 文檔,每個人都會想到 Adob​​e Reader。 但是,如果您是軟體開發人員並且想要在應用程式中顯 示 PDF 文件該怎麼辦? 您不想要求使用者設定 Adob​​e Reader 並在其中開啟文件。

您可能還需要實現其他與 PDF 相關的要求。 例如,列印 PDF 文件。 或為上傳的 PDF 文件產生縮圖。 或支援 在桌面或 Web 應用程式中編輯 PDF。

您所需要的只是一個可以渲染和列印 PDF 文件的 PDF 庫。

在 C# 中列印 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 編輯器。

您可以下載該庫的二進位檔案或使用其NuGet套件。 若要在沒有 評估模式限制的情況下試用 Docotic.Pdf,您可以使用此處的表格 取得免費的 限時授權金鑰。

.NET 不支援直接列印 PDF 文件。 您需要將 PDF 文件轉換為影像、XPS 文件,或將其繪製到 System.Drawing.Graphics 表面。 然後,您可以使用 .NET 類別從 Windows 窗體或 WPF 應用程式列印輸出。

在 Windows 窗體應用程式中,您可以使用 System.Drawing.Printing 命名空間中的類別。 還有方便的 PrintDialogPrintPreviewDialog 類別用於建立列印 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.FormsSystem.Drawing.Printing 命名空間中的列印類別會更容易。

查看 在 .NET 中列印 PDF 演示應用程序,該應用程式採用適用於 WinForms 和 WPF 的 C# 和 VB.NET 版本。 該應用程式展示如何:

  • 顯示 PDF 文件的列印預覽
  • 將 PDF 文件列印到選定的印表機
  • 設定紙張尺寸、縮放模式和其他列印設置

該應用程式使用Docotic.Pdf 庫、BitMiracle.Docotic.Pdf.Gdi 擴展DLL 以及來自 System.Windows.FormsSystem.Drawing.Printing 命名空間的列印類別。 您可以在 WPF 或 Windows 表 單專案中使用其 PdfPrintDocumentPdfPrintHelper 類別。

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 列印:

  • 新增[範例]的 PdfPrintDocumentPdfPrintHelperPrintSize 檔案(*pdf/PrintPdf)
  • 新增對 Docotic.Pdf 庫的引用
  • 新增 BitMiracle.Docotic.Pdf.Gdi 擴充 DLL 的引用 *(僅限 WPF)新增 System.Windows.Forms 和 System.Drawing 組件的引用

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 列印或渲染有疑問,請聯絡我們