如何在每页上添加一个页眉和页脚的html字符串

问题描述 投票:1回答:1

我是Itext的新手,并使用html字符串创建pdf。现在我需要在每个页面上添加页脚和页眉。我有一个html字符串,我想添加为页眉和页脚。

我浏览了java中的许多帖子和文档,但由于没有人使用html字符串作为页脚或标题,因此会让人感到困惑。

更新添加代码

这是我正在使用的代码。现在我可以添加页眉和页脚,但html呈现为字符串而不是html UI。

 public class TestPDF
{
    public static void GeneratePDF(string html)
    {
        try
        {
            Guid random_guid;
            random_guid = Guid.NewGuid();
            string fileName = random_guid.ToString() + ".pdf";
            string filename_with_folder = @"Temp\" + fileName;
            string DEST = System.IO.Path.Combine(HttpContext.Current.Request.PhysicalApplicationPath, filename_with_folder);
            new TestPDF().CreatePdf(DEST, html);
        }
        catch (Exception ex)
        {

            throw;
        }
    }
    public void CreatePdf(String dest, string html)
    {
        //Initialize PDF document
        PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
        string header = "Header HTmL HERE";
        Header headerHandler = new Header(header);
        PageXofY footerHandler = new PageXofY(pdf);
        //Assign event-handlers
        pdf.AddEventHandler(PdfDocumentEvent.START_PAGE, headerHandler);
        pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, footerHandler);
        // Initialize document
        Document document = new Document(pdf);
        Paragraph p = new Paragraph(html);
        document.Add(p);
        document.Close();
    }
}
//Header event handler
public class Header : IEventHandler
{
    string header;
    public Header(string header)
    {
        this.header = header;
    }
    public void HandleEvent(Event e)
    {
        //Retrieve document and
        PdfDocumentEvent docEvent = (PdfDocumentEvent)e;
        PdfDocument pdf = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        Rectangle pageSize = page.GetPageSize();
        PdfCanvas pdfCanvas = new PdfCanvas(
                page.GetLastContentStream(), page.GetResources(), pdf);
        Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
        canvas.SetFontSize(18f);
        //Write text at position
        canvas.ShowTextAligned(header,
                pageSize.GetWidth() / 2,
                pageSize.GetTop() - 30, TextAlignment.CENTER);
    }
}

//Footer handler
public class PageXofY : IEventHandler
{
    public PdfFormXObject placeholder;
    public float side = 20;
    public float x = 300;
    public float y = 25;
    public float space = 4.5f;
    public float descent = 3;
    public PageXofY(PdfDocument pdf)
    {
        placeholder =
                new PdfFormXObject(new Rectangle(0, 0, side, side));
    }
    public void HandleEvent(Event e)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)e;
        PdfDocument pdf = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        int pageNumber = pdf.GetPageNumber(page);
        Rectangle pageSize = page.GetPageSize();
        PdfCanvas pdfCanvas = new PdfCanvas(
                page.GetLastContentStream(), page.GetResources(), pdf);
        Canvas canvas = new Canvas(pdfCanvas, pdf, pageSize);
        //Paragraph p = new Paragraph()
        //        .Add("Page ").Add(pageNumber.ToString()).Add(" of");
        Paragraph p = new Paragraph()
                .Add("Footer html will here");
        canvas.ShowTextAligned(p, x, y, TextAlignment.RIGHT);
        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);
    }
}
c# itext itext7
1个回答
2
投票

这里不是itext的专家,但是我发现this tutorial就如何使用c#库为每个页面添加标题。

基本上,您创建一个事件处理程序类以将标头添加到页面并设置pdf对象以在相应的事件(页面开始或页面结束)上使用该事件处理程序。事件处理程序创建一个新的画布对象,填充它想要在页面上显示的内容,对其进行定位,然后将其呈现给页面。如果您的标题看起来与顶部或底部的内容重叠,则可能需要调整主要内容的页边距以为页眉和页脚腾出空间。

我不确定如何直接将html内容放入画布,但由于它不是页面内容的一部分,也许你可以放弃使用静态内容。

Bruno Lowagie更新:

如果使用@page规则在HTML中定义页眉/页脚,那么您只需在this tutorial中描述的HTML的CSS中定义页眉/页脚中需要的内容。

如果页眉/页脚稍微复杂一些,那么您需要创建一个事件处理程序类。 jump-start tutorial解释了如何将Paragraph等对象添加到Canvas对象中。它不包括HTML。但是,PDF to HTML tutorial解释了如何将HTML转换为iText对象(例如,滚动到该页面的底部)。

通过结合本答案的不同方面,您将能够解决问题。如果您已尝试过但未成功,请告诉我们您尝试过的内容,我们可以为您提供进一步的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.