首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有页眉和页脚的IText7 PDFHtml生成器

带有页眉和页脚的IText7 PDFHtml生成器
EN

Stack Overflow用户
提问于 2020-03-16 06:40:42
回答 1查看 1.9K关注 0票数 1

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

我的要求:

  1. 阿拉伯语支持。
  2. 生成10多个页面的能力。页脚可能因页而异。
  3. 有一个向WCF服务发送请求的web应用程序,该服务返回一个包含PDF.

的字节数组。

因此,我已经搜索了几天,寻找一个好的工具,我发现SelectPdf,它是完美的,除了它不是免费的,所以唯一的解决方案是IText7 PDFHtml。问题是,这个库为JAVA提供了很好的文档,我在学习C#示例并将JAVA转换为C#代码方面非常困难。以前有人对c#做过类似的事情吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-19 10:20:43

经过很长一段时间的搜索和尝试,我已经开始工作了,并实现了以下功能:

页眉中的footer.

  • Generating

  • 图像。页脚中的

  • Base64图像,除了在页脚上为所有页面编写相同的页脚之外,还可以在页脚的另一侧写入一些文本。

  • 生成的页面数为unlimited.

  • Page编号。

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

请在下面找到我的C#代码,如果您有任何改进,请张贴您的改进。

代码语言:javascript
复制
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();
    }
}

生成标题:

代码语言:javascript
复制
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();
    }
}

生成页脚:

代码语言:javascript
复制
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();
    }
}

我试图获得一个流作为输出,所以如果您也想这样做,您可以在您的主要服务中使用以下内容:

代码语言:javascript
复制
public byte[] GetData()
    {
        MemoryStream stream = new Pdfgenerator().createPdf();
        byte[] arr = stream.ToArray();
        return stream.ToArray();
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60701392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档