ZugferdInfo.cs
// 完毕:
using System;
using System.IO;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Collections.Generic;
using System.Globalization;
using GrapeCity.Documents.Pdf;
using GrapeCity.Documents.Text;
using s2industries.ZUGFeRD;
using GCTEXT = GrapeCity.Documents.Text;
using GCDRAW = GrapeCity.Documents.Drawing;

namespace DsPdfWeb.Demos
{
    // 此示例演示如何从 ZUGFeRD 兼容的 XML 附件中检索发票数据。
    // 所获取的发票数据的选定部分将打印到此示例生成的 PDF 中。
    // See ZugferdInfoExt 以获取打印所有 ZUGFeRD 数据的类似示例。

    // 包含 ZUGFeRD 数据的示例 PDF 发票,该示例将其用作输入
    // 由ZugferdInvoice生成​​。
    // 
    // ZUGFeRD 是基于 PDF 和 XML 文件格式的德国电子发票标准。
    // 它准备改变发票的处理方式,并可供任何类型的企业使用。
    // 它将使发件人和客户的发票处理更加高效。
    // 详细信息请参见什么是ZUGFeRD? 。
    // 
    // 此示例​​使用 ZUGFeRD-csharp 包
    // 解析附加到发票的 ZUGFeRD 兼容 XML。
    public class ZugferdInfo
    {
        public int CreatePDF(Stream stream)
        {
            // 带有 ZUGFeRD 数据的发票样本:
            var invoicePdf = Path.Combine("Resources", "PDFs", "zugferd-invoice.pdf");

            // 输出的文本格式:
            var tfData = new TextFormat() {
                Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "segoeui.ttf")), 
                FontSize = 12
            };
            var tfStrong = new TextFormat(tfData) {
                Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "segoeuib.ttf"))
            };
            var tfLabels = new TextFormat(tfData) {
                Font = GCTEXT.Font.FromFile(Path.Combine("Resources", "Fonts", "segoeuii.ttf")),
                FontSize = 11
            };
            float margin = 36;

            // 输出文件:
            var doc = new GcPdfDocument();
            using (FileStream fs = File.OpenRead(invoicePdf))
            {
                // 加载 ZUGFeRD 合规发票 PDF:
                var invoice = new GcPdfDocument();
                invoice.Load(fs);

                // 通过 ZUGFeRD 1.x 标准文件名从发票中获取 ZUGFeRD 附件:
                var attachment = invoice.EmbeddedFiles.Values.FirstOrDefault(it => it.File.FileName == "ZUGFeRD-invoice.xml");
                if (attachment != null)
                {
                    using (var xmlstream = attachment.GetStream())
                    {
                        // Load the invoice descriptor:
                        var descriptor = InvoiceDescriptor.Load(xmlstream);
                        var culture = CultureInfo.CreateSpecificCulture("en-US");

                        // 打印发票数据:
                        var page = doc.NewPage();
                        var g = page.Graphics;
                        var tl = g.CreateTextLayout();

                        tl.MaxWidth = page.Size.Width;
                        tl.MaxHeight = page.Size.Height;
                        tl.MarginAll = margin;

                        // 发票抬头:
                        tl.Append($"Invoice Number: ", tfLabels);
                        tl.AppendLine($"{descriptor.InvoiceNo}", tfData);
                        tl.Append($"Invoice Date: ", tfLabels);
                        tl.AppendLine($"{descriptor.InvoiceDate.Value:yyyy-MM-dd}", tfData);
                        tl.Append($"Seller Name: ", tfLabels);
                        tl.AppendLine($"{descriptor.Seller.Name}", tfData);
                        tl.Append($"Seller Address: ", tfLabels);
                        tl.AppendLine($"{descriptor.Seller.Street}, {descriptor.Seller.City}, {descriptor.Seller.Postcode}, {descriptor.Seller.Country}", tfData);
                        tl.Append($"Buyer Name: ", tfLabels);
                        tl.AppendLine($"{descriptor.BuyerContact.Name} {descriptor.Buyer.Name}", tfData);
                        tl.Append($"Buyer Address: ", tfLabels);
                        tl.AppendLine($"{descriptor.Buyer.Street}, {descriptor.Buyer.City}, {descriptor.Buyer.Postcode}, {descriptor.Buyer.Country}", tfData);
                        tl.AppendLine();

                        // 发票位置:
                        tl.TabStops = new List<TabStop>()
                        {
                            new TabStop(margin, TabStopAlignment.Leading),
                            new TabStop(page.Size.Width - margin * 2 - 144, TabStopAlignment.Trailing),
                            new TabStop(page.Size.Width - margin * 2, TabStopAlignment.Trailing),
                        };
                        decimal totals = 0;
                        var index = 1;
                        tl.AppendLine("#\tName\tQuantity\tAmount", tfLabels);
                        descriptor.TradeLineItems.ForEach(it =>
                        {
                            tl.AppendLine($"{index++}\t{it.Name}\t{Convert.ToInt32(it.BilledQuantity)}\t{it.LineTotalAmount.Value.ToString("C", culture)}", tfData);
                            totals += it.LineTotalAmount.Value;
                        });
                        // 发票总额:
                        tl.AppendLine($"\tTOTAL:\t\t{totals.ToString("C", culture)}", tfStrong);

                        g.DrawTextLayout(tl, PointF.Empty);

                        // 完毕:
                        doc.Save(stream);
                        return doc.Pages.Count;
                    }
                }
                else
                    return 0;
            }
        }
    }
}