このページには自動翻訳されたテキストを含めることができます。

C# および VB.NET で PDF ドキュメントをレンダリングおよび印刷する

PDF ドキュメントを読むとき、誰もが Adobe Reader を思い浮かべます。 しかし、あなたがソフトウェア開発 者で、アプリケーションで PDF ドキュメントを表示したい場合はどうすればよいでしょうか? ユーザーに Adobe Reader をセットアップしてそこでドキュメントを開くように要求する必要はありません。

他の PDF 関連の要件も実装する必要がある場合があります。 たとえば、PDF ドキュメントを印刷します。 ま たは、アップロードされた PDF ドキュメントのサムネイルを生成します。 または、デスクトップまたは Web アプリケーションでの PDF 編集をサポートします。

必要なのは、PDF ドキュメントをレンダリングして印刷できる PDF ライブラリだけです。

C# で PDF を印刷

PDF ドキュメントを表示、編集、印刷するための .NET ライブラリ

Docotic.Pdf ライブラリ を使用すると、C# および VB.NET で PDF ドキュメントを表 示、編集、印刷できます。 3 つのコア機能を使用して、複雑な PDF レンダリング フローを実装できます。

1 つ目は、PDF を画像に変換する 機能です。 この機能に基づいてほとんど すべてを実装できます。 PDF の印刷から、HoloLense での PDF の表示、または Instagram への PDF の投稿 まで。 画像はどこでもサポートされているため、これが可能です。

2 番目の重要な機能は、System.Drawing.Graphics の描画面に PDF ページを描画できることです。 Windows フォームまたは WPF アプリケーションで PDF をレンダリングおよび印刷できるようになります。 この機能を 使用するには、BitMiracle.Docotic.Pdf.Gdi 拡張 DLL をプロジェクトに追加し ます。

最後に重要なことは、PDF ページ オブジェクトを抽出する機能です。 この機能を使用すると、C# または VB.NET アプリケーションで PDF ビューアまたは PDF エディタを構築できます。

Docotic.Pdf ライブラリ 9.3.16887-dev 回帰テスト 14,635人が合格 NuGet の合計ダウンロード数 4,075,269

ライブラリの バイナリ をダウンロードするか、その NuGet パッケー ジ を使用できます。 評価モードの制限なしで Docotic.Pdf を試すには、こちらの フォーム を使用して、無料の期間限定ライセンス キーを取得できます。

.NET は、そのままでは PDF ドキュメントの印刷をサポートしていません。 PDF ドキュメントを画像や XPS ファイルに変換するか、 System.Drawing.Graphics サーフェスに描画する必要があります。 その後、.NET クラスを使用して、Windows フォームまたは WPF アプリケーション内から出力を印刷できます。

Windows Forms アプリケーションでは、System.Drawing.Printing 名前空間のクラスを使用できます。印刷 UI を構築するための便利な PrintDialog クラスと PrintPreviewDialog クラスもあります。

macOS および Linux 環境では、System.Drawing 名前空間からのものを使用することは推奨されないことに 注意してください。 macOS および Linux の System.Drawing 実装は不完全であり、Windows の実装とは異 なります。 macOS および Linux 環境で System.Drawing 名前空間を使用すると、不正確な結果や一貫性の ない結果が得られる可能性があります。

WPF は別の PrintDialog クラスを提供しますが、印刷プレビュー用のクラスは提供しません。 幸いなこと に、WPF では System.Windows.Forms.dll の PrintPreviewDialog クラスを使用できます。 したがっ て、WPF アプリケーションで System.Windows.Forms および System.Drawing.Printing 名前空間の印刷ク ラスを使用する方が簡単です。

WinForms および WPF 用の C# バージョンと VB.NET バージョンで提供される .NET で PDF を印刷す る デモ アプリケーションを見てください。 このアプリケーションは次の方法を示します:

  • PDF ドキュメントの印刷プレビューを表示します
  • PDF ドキュメントを選択したプリンターで印刷します
  • 用紙サイズ、拡大縮小モード、その他の印刷設定を設定します

アプリケーションは Docotic.Pdf ライブラリ、BitMiracle.Docotic.Pdf.Gdi 拡張 DLL、および System.Windows.Forms および System.Drawing.Printing 名前空 間の印刷クラスを使用します。 。 その PdfPrintDocument クラスと PdfPrintHelper クラスを WPF または Windows フォーム プロジェクトで使用で きます。

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 拡張メソッ ドを使用して、現在の PDF ページを Graphics オブジェクトに描画します。

PdfPrintHelper クラスを使用すると、印刷用の UI クラスで PdfPrintDocument を使用できます。 たと えば、次のように 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 印刷を実装するには、次の手順を実行します。

  • サンプル から PdfPrintDocumentPdfPrintHelper、および PrintSize ファイル を追加します
  • Docotic.Pdf ライブラリへの参照を追加
  • BitMiracle.Docotic.Pdf.Gdi 拡張 DLL への参照を追加します
  • (WPF のみ) System.Windows.Forms および System.Drawing アセンブリへの参照を追加します

System.Drawing.Printing 名前空間のクラスは、Windows Forms および 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;

    // 1 ページを保存する
    pdf.Pages[0].Save("page0.png", options);

    // ドキュメント全体を複数ページのモノクロ TIFF として保存します
    options.Compression = ImageCompressionOptions.CreateTiff().SetBitonal();
    pdf.SaveAsTiff("your_document.tiff", options);
}

次に、代替の印刷フレームワークまたはツールを使用して画像を印刷します。 Print PDF in Eto.Forms デモ アプリケーションを見て、System.Drawing.Printing を使用せず に PDF ドキュメントを印刷する方法を示します。

C# および VB.NET で PDF をレンダリングする

アプリケーションでの PDF の表示は印刷と似ています。 ASP.NET、WPF、Eto.Forms、Avalonia、またはその他 のアプリケーション タイプでは、PDF を画像に変換してから、画像を表示し ます。

Windows Forms アプリでは、任意のコントロールから System.Drawing.Graphics コンテキスト上に PDFペー ジを描画できます。 または、PDF ページを System.Drawing.Bitmap に変換し、そのビットマップを PictureBox に表示することもできます。

このサンプルは、PDF ページを C# の 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 の印刷またはレンダリングに関する質問がある場合は、お問い合わせ してください。