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

使用 C# 和 VB.NET 建立 PDF 文檔

身為 .NET 開發人員,您是否需要產生 PDF 報表、發票、收據或其他文件? 使用 Docotic.Pdf 函式 庫 在 .NET Core、.NET Standard 或 .NET Framework 專案中產生 PDF 文件。 您可以輕鬆 完成此操作,而無需了解 PDF 格式。

使用 C# 和 VB.NET 建立 PDF 文檔

用於 PDF 產生的 .NET API

Docotic.Pdf 是 100% 託管程式碼庫,無需外部依賴。 您可以使用它在 Windows、Linux、Amazon 和 Azure 雲 端環境中建立 PDF 文件。 macOS、iOS、Android 和其他雲端環境也很好。

該庫提供了生成 PDF 文件的不同方法。 首先,您可以使用進階版面配置 API 新增頁首和頁尾、表格、段落,並 自動將內容分解到頁面。 佈局 API 可在 免費的 Docotic.Pdf.Layout 附加元 件 中找到。

或者,您可以使用 HTML to PDF 外掛程式(也是免費的)基於 HTML 範本建 立 PDF 文件。 閱讀將 HTML 轉換為 PDF 文章以了解更多詳細資訊。

您也可以使用核心庫 API 產生 PDF 文件。 它支援任何 PDF 內容:

但是,核心 API 不支援高階佈局元件,例如標題、表格、部分。 使用核心庫,您將需要自行測量內容並將其分割到 PDF 頁面之間。

Docotic.Pdf 函式庫 9.3.17014-dev 佈局附加元件 9.3.17014-dev HTML 轉 PDF 插件 9.3.17014-dev
回歸測試 14,645 已通過 NuGet 總下載量 4,172,488

您也可以將附加元件與核心庫一起使用。 例如,使用佈局 API 產生 PDF 文檔,然後使用核心庫新增更多內容。 請注意,佈局插件支援 .NET Standard 2.1、.NET Core、.NET 5 和更新的框架。 核心庫和 HTML 到 PDF 附加 元件支援 .NET Standard 2.0、.NET 4.7.2+、.NET Core、.NET 5 及更高版本。

Docotic.Pdf 附加元件可在 NuGet 上使用,並包含在庫的 zip with binaries 中。 若要 嘗試不受評估模式限制的函式庫,您可以在此處 取得免費的限時授權金鑰。

使用佈局 API 建立 PDF 文檔

此 C# 範例展示如何使用佈局 API 在 C# 中產生 PDF 文件:

PdfDocumentBuilder
    .Create()
    .Generate("long-text.pdf", doc => doc.Pages(page =>
    {
        string text = File.ReadAllText(@"C# in Depth, Fourth Edition.txt");
        page.Content().Text(text);

        page.Footer().AlignCenter().Text(t => t.CurrentPageNumber());
    }));

該程式碼將文字檔案轉換為 PDF。 它將長文本拆分為頁面,並在頁腳區域繪製頁碼。 您不需要計算文字高度或 計算頁數 - 該程式庫會處理這些日常任務。

佈局 API 是一個流暢的 API。 大多數呼叫都可以連結在一起,因此您可以編寫比“聲明式”框架更緊湊的程式 碼。 讓我們更詳細地回顧一下該 API。

設定 PDF 文件屬性

PDF 產生從 PdfDocumentBuilder 類別 開始。 它允許您指 定生成的 PDF 文件的屬性。 例如,您可以設定元資料、加密、PDF 版本或啟用快速 Web 檢視。 這是基本的 C# 範例:

PdfDocumentBuilder
    .Create()
    .Encryption(new PdfStandardEncryptionHandler("owner", "user"))
    .Info(info =>
    {
        info.Author = "Docotic.Pdf library";
        info.Title = "How to create PDF in .NET";
        info.Keywords = "C#, VB.NET";
    })
    .Version(PdfVersion.Pdf16)
    .Generate("result.pdf", doc => doc.Pages(_ => {}));

此範例使用自訂元資料建立一個空的受密碼保護的 PDF 文檔,並將其儲存到文件中。 您也可以將文件儲存到流 中,只需使用 PdfDocumentBuilder.Generate(Stream, ..) 重 載

當您設定 PdfDocumentBuilder 時,就可以用內容填入 PDF 文件了。 佈局 API 提供了一個 Document 對象,用於註冊公共資源(排版、圖像)和定義 PDF 頁面內 容。 您可以在 PdfDocumentBuilder.Generate 方法的第二個參數中配置 Document。 讓我們學習如何設定 PDF 頁面。

定義 PDF 頁面佈局

此 C# 範例展示如何建立橫向 A3 頁面的 PDF 文件:

PdfDocumentBuilder.Create().Generate("pages.pdf", doc =>
{
    doc.Pages((PageLayout page) =>
    {
        page.Size(PdfPaperSize.A3, PdfPaperOrientation.Landscape)
            .MarginVertical(50)
            .MarginHorizontal(40);

        page.Header().PaddingBottom(30).AlignRight().Text("Hello PDF");

        page.Content().Column(c =>
        {
            c.Item().Text("Page 1");
            c.Item().PageBreak();
            c.Item().Text("Page 2");
        });

        page.Footer().Text(t => t.CurrentPageNumber());
    });
});

Document.Pages() 方法 定義一頁或多頁的佈局。 首先,範例程 式碼為所有頁面設定通用設定 - 大小、方向、邊距。 您也可以指定內容方向、預設文字樣式或背景顏色。

然後,該範例會產生頁面佈局和內容。 PageLayout 類別 提供了將頁 面內容放置在以下槽中的方法:

  • Background() - 被其他內容覆蓋的背景層
  • Header() - 所有頁面的公共標題
  • Content() - 首頁內容
  • Footer() - 所有頁面的通用頁腳
  • Foreground() - 覆蓋其他內容的前景層

佈局引擎會根據新增至 PageLayout.Content() 槽的內容產生頁面。 其他插槽在每個頁面上重複。 您可以使 用 LayoutContainer 類別 將內容新增至插槽。 這是佈局 API 的關鍵構建塊,它允許您生成任意佈局、表格、文字或圖像。

上一個範例使用垂直堆疊內容的 LayoutContainer.Column 方法。 此列包含 3 個項目 - 第一頁的文字區塊、 明確分頁符號和第二頁的文字區塊。

還有 LayoutContainer.Row 方法。 查看如何同時使用行和列建立多列 PDF 文件

您可以在 PDF 文件中混合不同的頁面佈局。 只需多次呼叫 Document.Pages 方法即可。 有關範例,請參閱 GitHub 上的 PDF 頁面佈局設定 範例。

新增文字到 PDF 文件

文字是PDF文件的重要組成部分。 您可以使用 LayoutContainer.Text 方 法 新增文字。 之前,您看到了 LayoutContainer.Text(string) 重載的用例。 讓我們看看這個方法的另一個重載:

PdfDocumentBuilder.Create().Generate("text.pdf", doc =>
{
    doc.Pages(p => p.Content().Text(text =>
    {
        text.Span("VB.NET").Style(t => t.Strong);
        text.Span(" is a multi-paradigm, object-oriented programming language, implemented on.NET, Mono, and the ");
        text.Hyperlink(".NET Framework", new Uri("https://dotnet.microsoft.com/en-us/download/dotnet-framework"));
        text.Line(".");

        text.Line("Microsoft launched VB.NET in 2002 as the successor to its original Visual Basic language.");
    }));
});

TextContainer 類別 提供了繪製文字、連結、頁碼的方法。 使用 SpanLine 方法將文字新增至目前行。 Line 方法也完成目前行。 此範例也使用新增外部資源連結的 Hyperlink 方法。

這是另一個範例,顯示如何在頁腳中使用動態頁碼:

PdfDocumentBuilder.Create().Generate("footer.pdf", doc =>
{
    doc.Pages(p => p.Footer().AlignRight().Text(text =>
    {
        text.Style(t => t.Parent.FontColor(new PdfRgbColor(255, 0, 0)));

        text.CurrentPageNumber();
        text.Span(" / ");
        text.PageCount();
    }));
});

佈局 API 提供了一種設定頁碼格式的方法。 例如,您可以像這樣繪製十六進位頁碼:

text.CurrentPageNumber().Format(p => "0x" + p?.ToString("x2"));

在 C# 和 VB.NET 中為 PDF 文件新增頁首和頁尾範例 展示如何將頁碼格式設定為羅馬數字。

您可能會看到上面的範例使用 Style 方法。 讓我們更詳細地研究文本樣式的概念。

版式

文字樣式可讓您自訂文字外觀。 TextStyle 類別 提供更改字體大小、 字母間距、顏色和其他文字屬性的方法。 TextStyle 物件是不可變的,因此每個方法呼叫都會產生新的文字樣 式。 您可以在不同的版面配置層級套用文字樣式:

PdfDocumentBuilder.Create().Generate("text-styles.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.TextStyle(TextStyle.Parent.FontSize(30));

        page.Content()
            .TextStyle(TextStyle.Parent.FontColor(new PdfRgbColor(0, 0, 255)))
            .Text(t =>
            {
                t.Style(TextStyle.Parent.Underline());

                t.Span("Hello PDF").Style(TextStyle.Parent.DirectionRightToLeft());
            });
    });
});

TextStyle.Parent 屬性傳回一個特殊樣式,所有文字屬性均未定義。 前面的範例以相反的順序(從右到左) 將「Hello PDF」繪製為藍色、底線、30 點字體大小。 請參閱自訂 PDF 文件中的文字外 觀 範例,以了解另一個文字樣式繼承範例。

TextStyle 類別支援自訂除關聯字型之外的所有內容。 當您需要為文字樣式指定自訂字體時,請使用 Document.TextStyleWithFont 方法。 此 C# 範例展示如何使用系統字體:

PdfDocumentBuilder.Create().Generate("fonts.pdf", doc =>
{
    doc.Pages(page =>
    {
        TextStyle style = doc.TextStyleWithFont(SystemFont.Family("Arial").Bold());
        page.Content().Text("Bold text").Style(style);
    });
});

預設情況下,佈局引擎會刪除未使用的字體字形。 因此,即使對於大字體,生成的文件也可能具有較小的尺寸。 您也可以指定自訂字型載入器、後備字型、缺失字形的處理程序。 有關更多詳細信息,請參閱在 PDF 文件中使 用不同字體 範例。

佈局 API 提供了一組預定義樣式。 您可以透過 Typography 類別 使 用或自訂它們:

PdfDocumentBuilder.Create().Generate("typography.pdf", doc =>
{
    doc.Typography(t =>
    {
        var baseFont = new FileInfo("arial.ttf");
        t.Document = doc.TextStyleWithFont(baseFont);
        t.Header = t.Parent.FontSize(20).FontColor(new PdfGrayColor(20));
        t.Footer = t.Footnote;
    });

    doc.Pages(page =>
    {
        page.Header().AlignCenter().Text("Header");

        page.Content().Text(t =>
        {
            t.Line("Title").Style(t => t.Title);
            t.Line("Heading 1").Style(t => t.Heading1);
            t.Line("Regular");
        });

        page.Footer().Height(20).AlignCenter().Text(t => t.CurrentPageNumber());
    });
});

使用 Typography 類,您不需要使用變數來保留文字樣式引用。 您可以使用 Document.Typography 方 法 註冊必要的樣式,然後從 Typography 物件載入它們。 了解如何在 Typography 範例中使用預設和自訂樣式。

圖片

與文字和字體一樣,圖像是 PDF 文件的另一個基本部分。 佈局 API 允許您新增這樣的圖像:

PdfDocumentBuilder.Create().Generate("image.pdf", doc =>
{
    var imageFile = new FileInfo("image.jpg");
    Image image = doc.Image(imageFile);
    doc.Pages(page => page.Content().MaxWidth(200).Image(image));
});

表格

佈局 API 可讓您產生表格。 此 C# 範例展示如何將表格新增至 PDF 文件:

PdfDocumentBuilder.Create().Generate("table.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Content().Table(t =>
        {
            t.Columns(c =>
            {
                c.ConstantColumn(200);
                c.RelativeColumn(1);
            });

            t.Header(h =>
            {
                h.Cell().Text("Product");
                h.Cell().Text("Features");
            });

            t.Cell().Text("Docotic.Pdf");
            t.Cell().Text("Extract text, PDF to images, compress PDF");
            t.Cell().Text("Docotic.Pdf.Layout");
            t.Cell().Text("Create PDF");
        });
    });
});

您可以建立任何複雜程度的表。 此範例 展示如何使用儲存格邊框、背景和跨度。

PDF 文件支援內部鏈接,可讓您產生書籤或目錄。 此基本 C# 範例展示如何使用佈局 API 新增指向文件部分的連結:

PdfDocumentBuilder.Create().Generate("link.pdf", doc =>
{
    doc.Pages(page =>
    {
        page.Content().Column(c =>
        {
            const string SectionName = "Chapter 1";
            c.Item().SectionLink(SectionName).Text("Link");

            c.Item().PageBreak();

            c.Item().Section(SectionName).Text("Target");
        });
    });
});

您也可以從 GitHub 下載並嘗試將目錄新增至 PDF 文件 範例。

複雜的佈局

您可以組合不同的佈局元件來產生複雜的 PDF 文件。 從 GitHub 下載並嘗試產生具有複雜佈局的 PDF 文 件 範例。

可以擴充佈局 API。 LayoutContainer.ComponentLayoutContainer.Container 方法可讓您重複使用自 訂元件。 佈局元件 範例展示如何使用 ILayoutComponent 介面實作自訂元件。

結論

Docotic.Pdf 庫 提供了在 C# 和 VB.NET 中建立 PDF 文件的不同方法。 您可以使用或不 使用佈局插件從頭開始產生PDF文件。 或者,您可以使用 HTML 到 PDF 外掛程 式 從 HTML 建立 PDF。

如果您對 PDF 產生有任何疑問,請聯絡我們