用于 C# 的带有页眉和页脚的 IText7 PDFHtml 生成器

IText7 PDFHtml generator with header and footer for C#

我正在尝试从预定义的 HTML 内容生成 PDF。我设法生成了内容,但没有所需的 HTML 页眉、HTML 页脚,也不支持阿拉伯语。

我的要求:

  1. 阿拉伯语支持。
  2. 能够生成超过 10 个页面。
  3. 页脚可能因页面而异。

  4. 有一个向 WCF 服务发送请求的 Web 应用程序,服务 returns 一个包含 PDF 的字节数组。

所以,我一直在寻找一个好的工具几天,我找到了 SelectPdf,它是完美的,除了它不是免费的,所以唯一的解决方案是 IText7 PDFHtml。 问题是这个库有很好的 JAVA 文档,我真的很难遵循 C# 示例并将 JAVA API 转换为 C# 代码。 以前有人用 c# 做过类似的事情吗?

经过长时间的搜索和尝试,我已经成功运行并实现了以下功能:

  1. 图片在header.

  2. 页脚中的 Base64 图片,此外还可以在页脚的另一侧写入一些文本。

  3. 为除最后一页之外的所有页面生成相同的页脚。
  4. 生成的页面数量没有限制。
  5. 页码。

之前的所有功能都是免费的,但是支持阿拉伯语需要许可证,所以我还是要付费:)

请在下面找到我的 C# 代码和 post 您的改进(如果有的话)。

public class Pdfgenerator
{
    public const string FONT = "Fonts/NotoNaskhArabic-Regular2.ttf";
    public static string HEADER_TEXT = "<table width=\"100%\" border=\"0\"><tr><td>Header</td><td align=\"right\">Some title</td></tr></table>";
    public static string FOOTER_TEXT = "<table width=\"100%\" border=\"0\"><tr><td>Footer</td><td align=\"right\">Some title</td></tr></table>";
    public MemoryStream createPdf()
    {
        string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
        MemoryStream file = new MemoryStream();
        PdfDocument pdfDocument = null;
        PdfDocument pdfDoc = null;
        PdfDocument pdfDocument1 = null;
        try
        {

            using (file)
            {
                PdfFont f = PdfFontFactory.CreateFont(apPath + FONT, PdfEncodings.IDENTITY_H);
                string header = "pdfHtml Header and footer example using page-events";
                Header headerHandler = new Header(header);
                Footer footerHandler = new Footer();
                ConverterProperties converterProperties = new ConverterProperties();
                PdfWriter writer1 = new PdfWriter(apPath + "test1.pdf");
                pdfDocument1 = new PdfDocument(writer1);
                pdfDocument1.AddEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
                pdfDocument1.AddEventHandler(PdfDocumentEvent.END_PAGE, footerHandler);
                converterProperties = new ConverterProperties().SetBaseUri(apPath);

                HtmlConverter.ConvertToDocument(File.ReadAllText(apPath + "content.html"), pdfDocument1, converterProperties);
                footerHandler.lastPage = pdfDocument1.GetLastPage();

                pdfDocument1.Close();
            }
        }
        catch (Exception ex)
        {

        }
        finally
        {
            file.Dispose();
        }

        return new MemoryStream();
    }
}

正在生成 header:

class Header : IEventHandler
{
    private string header;
    private Image image;
    public Header(string header)
    {
        string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
        this.header = header;
        image = new Image(ImageDataFactory.Create(apPath + "Images/RANDOM_PHOTO.jpg"));

    }

    public void HandleEvent(Event @event)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
        PdfDocument pdf = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        Rectangle pageSize = page.GetPageSize();

        Canvas canvas = new Canvas(new PdfCanvas(page), pdf, pageSize);
        canvas.SetFontSize(18);


        // Write text at position
        canvas.Add(image);
        canvas.Close();
    }
}

正在生成页脚:

class Footer : IEventHandler
{
    public PdfPage lastPage = null;
    protected PdfFormXObject placeholder;
    protected float side = 20;
    protected float x = 300;
    protected float y = 25;
    protected float space = 4.5f;
    protected float descent = 3;

    public Footer()
    {
        placeholder = new PdfFormXObject(new Rectangle(0, 0, side, side));
    }

    public void HandleEvent(Event @event)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)@event;
        PdfDocument pdf = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        int pageNumber = pdf.GetPageNumber(page);
        Rectangle pageSize = page.GetPageSize();
        // Creates drawing canvas
        PdfCanvas pdfCanvas = new PdfCanvas(page);
        Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);

        IList<iText.Layout.Element.IElement> elements = HtmlConverter.ConvertToElements("<table border=\"0\"><tr><td><img src=\"data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\" alt=\"Italian Trulli\"></td></tr></table>");
        Paragraph p = new Paragraph();

        foreach (iText.Layout.Element.IElement e in elements)
        {
            if (e is IBlockElement) {
                p.Add((IBlockElement)e);
            }
        }
        if (lastPage == docEvent.GetPage()) {

        }
        else
        {
            canvas.ShowTextAligned(p, 25, 75, TextAlignment.LEFT);
        }

        canvas.Close();

        // Create placeholder object to write number of pages
        pdfCanvas.AddXObject(placeholder, x + space, y - descent);
        pdfCanvas.Release();
    }

    public void writeTotal(PdfDocument pdf)
    {
        Canvas canvas = new Canvas(placeholder, pdf);
        canvas.ShowTextAligned(pdf.GetNumberOfPages().ToString(),
                0, descent, TextAlignment.LEFT);
        canvas.Close();
    }
}

我试图将一个流作为输出,所以如果你也想要它,你可以在你的主要服务中使用以下内容:

public byte[] GetData()
    {
        MemoryStream stream = new Pdfgenerator().createPdf();
        byte[] arr = stream.ToArray();
        return stream.ToArray();
    }