繁体   English   中英

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

[英]Adding a link with iText7 to the header or footer of a PDF

我目前正在尝试向pdf文档页脚的页眉添加链接,但是该库出现以下错误System.IndexOutOfRangeException:'请求的页码0超出范围。' 使用IText7库将链接添加到标题时。

将相同的对象添加到页面的主体可以正常工作。 用try catch包围代码会产生以下结果: pdf输出图像

我找不到任何代码示例网上关于IText7这个问题,在iTextSharp的解决方案不适用了。

我的问题是如何在pdf标头中添加指向外部网站的链接? 当前行为是库中的错误还是有意的?

我正在使用以下代码:

主要方法是加载html,初始化文档并将对象添加到页眉和主页。

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

负责将对象添加到标头的事件处理程序类。 该代码在try-catch中给出了上面提到的错误

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 { }
    }
}

包含头对象的html文件(在Convert()方法中加载的FooterTest.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>

这是我关于堆栈溢出的第一个问题,因此,对这个问题本身的任何反馈也表示赞赏。

您遇到的不完全是一个错误,但是在这种情况下,iText绝对应该更正常地失败并进行解释。

这里的问题是,对于Canvas类,实际上不知道在其上执行绘图的页面是什么。 通常, Canvas只是内容绘制操作的高级包装,可以将其放置在任何内容流上(例如,以XObject形式,页面内容流等形式)。 但是,链接是在页面级别上专门定义的(通过链接注释)。

解决此问题很容易。 我可以建议您两种方法。

第一种方法是通过重写CanvasRenderer来解决此问题:

// 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;
    }
}

第二种方法是使用Document实例而不是Canvas Document始终与页面内容一起使用,因此此处不存在所说明的问题。 您可以使用固定位置将内容放置在PdfHeader中:

更换

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM