当前位置: 首页 > 知识库问答 >
问题:

在PDF的页眉或页脚添加带有iText7的链接

别旻
2023-03-14

我当前正试图添加一个链接到pdf文档的页脚页眉,但是库给出了以下错误System.IndexoutOfrangeException:“请求的页码0已超出范围。”当使用IText7库将链接添加到标头时。

我在IText7中找不到任何关于这个问题的在线代码示例,ITextSharp中的解决方案不再适用。

我的问题是我如何添加一个链接到一个外部网站到PDF的标题?当前的行为是库中的bug还是有意的?

public void Convert()
{
    // Initialize template
    IList<IElement> templateElements = HtmlConverter.ConvertToElements(File.ReadAllText("FooterTest.html"));

    // Initialize document
    PdfWriter pdfWriter = new PdfWriter("Output.pdf");
    PdfDocument pdfDocument = new PdfDocument(pdfWriter);
    Document document = new Document(pdfDocument);
    document.SetTopMargin(100);

    // Adding the header object to the header and the main body
    pdfDocument.AddEventHandler(PdfDocumentEvent.START_PAGE, new PdfHeader((IBlockElement)templateElements[0], document));
    document.Add((IBlockElement)templateElements[0]);

    document.Close();
}
public class PdfHeader : IEventHandler
{
    private readonly IBlockElement footer;
    private readonly Document doc;

    public PdfHeader(IBlockElement footer, Document doc)
    {
        this.doc = doc;
        this.footer = footer;
    }

    public void HandleEvent(Event headerEvent)
    {
        PdfDocumentEvent docEvent = (PdfDocumentEvent)headerEvent;
        PdfDocument pdf = docEvent.GetDocument();
        PdfPage page = docEvent.GetPage();
        Rectangle pageSize = page.GetPageSize();
        PdfCanvas pdfCanvas = new PdfCanvas(page.GetLastContentStream(), page.GetResources(), pdf);
        Rectangle rectangle = new Rectangle(
            pdf.GetDefaultPageSize().GetX() + doc.GetLeftMargin(),
            pdf.GetDefaultPageSize().GetTop() - 80,
            page.GetPageSize().GetWidth() - doc.GetLeftMargin() - doc.GetRightMargin(),
            50);

        //Below is the code where the error is produced.
        try
        {
            new Canvas(pdfCanvas, pdf, rectangle).Add(footer);

        }
        catch { }
    }
}

包含header对象(Convert()方法中加载的footertest.html)的html文件

<html>
    <body>
        <table>
            <tr>
                <td>
                This is a some text not containing a link.
                </td>
            </tr>
            <tr>
                <td>
                This text contains a link to <a href="https://www.google.com">Google</a> to demonstrate the issue.
                </td>
            </tr>
        </table>
    </body>
</html>

这是我关于堆栈溢出的第一个问题,因此对问题本身的任何反馈也很感激。

共有1个答案

连坚白
2023-03-14

您所遇到的并不完全是bug,但是在本例中,iText肯定会失败得更优雅和更有解释性。

这里的问题是,对于canvas类,实际上不知道执行绘图的页面是什么。通常情况下,canvas只是内容绘制操作的高级包装器,可以放置在任何内容流中(例如,表单XObject、页面内容流等)。然而,链接是在页面级别上专门定义的东西(通过链接注释)。

解决这个问题是很容易的。我可以建议你两种方法。

// set the custom renderer:
Canvas canvas = new Canvas(pdfCanvas, pdf, rectangle);
canvas.setRenderer(new PageCanvasRenderer(canvas, page));
canvas.add(footer);

...

private static class PageCanvasRenderer extends CanvasRenderer {
    private final PdfPage page;

    public PageCanvasRenderer(Canvas canvas, PdfPage page) {
        super(canvas);
        this.page = page;
    }

    @Override
    protected LayoutArea updateCurrentArea(LayoutResult overflowResult) {
        if (currentArea == null) {
            currentArea = new RootLayoutArea(canvas.getPdfDocument().getPageNumber(page), canvas.getRootArea().clone());
        }
        return currentArea;
    }
}
new Canvas(pdfCanvas, pdf, rectangle).Add(footer);

Document document = new Document(pdf);

Div canvas = new Div().setFixedPosition(pdf.getPageNumber(page), rectangle.getLeft(), rectangle.getBottom(), rectangle.getWidth());
canvas.add(footer);

document.add(canvas);
// Don't close document itself! It would close the PdfDocument!
document.getRenderer().close();
 类似资料:
  • 我试图创建一个带有页眉和页脚的PDF。页眉和页脚都是图像。由于我的pdf创建了随机数量的页面,我需要自动将其添加到每一页。我知道我需要使用某种eventhandler。不幸的是,我找不到vb.net语言中的任何示例,我只能找到java/C#示例,我真的不擅长阅读/转换这些语言vb.net.我还不是编程专家。 谁能给我指一下正确的方向吗。 Edit4:删除的随机内容不再需要回答我的问题。 下面这段代

  • 我在运行时用一个模板文件在itext7.pdfhtml中构建一个PDF。我想在生成的PDF中的每一页都添加一个页脚,该PDF有两页,但出于某种原因,页脚只出现在第二页。

  • 问题内容: 我在将新的简单XWPFTable添加到XWPFHeader(或Footer)时遇到了严重的麻烦。不幸的是,似乎只有一个人遇到相同的问题(https://bz.apache.org/bugzilla/show_bug.cgi?id=57366#c0)。 有谁有办法实现这一目标? 任何帮助将不胜感激! 亲切的问候… 〜丹尼尔 问题答案: 这可以使用公共XWPFTable insertNew

  • 我花了一点时间试图找到一种方法来向添加一个标头,但没有成功。 这是我目前得到的: 似乎是处理项的对象。由于我找不到任何方法,所以我决定使用的方法,并在第一个位置添加header视图以充当header。 这就是事情变得更丑陋的地方: 在创建活动的不同时刻,尝试调用的几次(也尝试在设置好所有内容后添加视图,甚至适配器的数据)之后,我意识到我不知道这是否是正确的方法(而且看起来并不正确)。 PS:另外,

  • 问题内容: 我正在使用iText 5创建pdf,并希望添加页脚。我所做的一切都像第14章中的“ iText in action”一书中所述。 没有错误,但没有显示页脚。有人可以告诉我我在做什么错吗? 我的代码: 问题答案: 您报告的问题无法重现。我以您的示例为例,并使用此事件创建了TextFooter示例: 请注意,我只创建了一次和实例,从而提高了性能。我还介绍了页脚和页眉。您声称要添加页脚,但实