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

时间:2020-03-16 06:40:42

标签: c# itext7 pdfhtml

我正在尝试从预定义的HTML内容生成PDF。我设法生成了内容,但是没有必需的HTML标头,HTML页脚和阿拉伯语言。

我的要求:

  1. 阿拉伯语支持。
  2. 生成10个以上页面的能力。
  3. 页脚在一页之间可能会有所不同。

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

因此,我一直在寻找一个好的工具几天,我发现SelectPdf十分完美,除了它不是免费的以外,因此唯一的解决方案是IText7 PDFHtml。 关键是该库具有适用于JAVA的良好文档,而我在遵循C#示例并将JAVA API转换为C#代码方面确实很费劲。 有人用c#做过类似的事情吗?

1 个答案:

答案 0 :(得分:0)

经过漫长的搜索和尝试,我使其工作并实现了以下功能:

  1. 标题中的图像。

  2. 页脚中的
  3. Base64图像,以及在页脚另一侧写一些文本的功能。

  4. 为除最后一页之外的所有页面生成相同的页脚。
  5. 生成的页面数是无限的。
  6. 页码。

以前的所有功能都是免费的,但是,支持阿拉伯语需要许可证,因此无论如何我都必须付费:)

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

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();
    }
}

生成标题:

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();
    }