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

使用java中的itext库为合并的pdf创建多页索引文件(TOC)

常坚
2023-03-14

如何使用iTextSharp将多页ToC写入包含合并文档的PDF末尾?

在java中使用itext库为合并的pdf创建索引文件(TOC)的答案解释了如何在合并pdf时创建TOC页面(在iTextSharp手册中进行了分类http://developers.itextpdf.com/examples/merging-pdf-documents/merging-documents-and-create-table-contents#795-合并TOC。java)。此答案中的代码基于这些示例。

然而,只有当ToC为1页长时,它才起作用。如果内容变长,则会在同一页上重复,而不是跨越到下一页。

尝试通过以下方式将链接直接添加到文本:

ct.Add(new Chunk("link").SetLocalGoto("p1"))

导致异常(“无法添加批注,文档中的页面不足”)。

有人能解释一种方法,允许我在合并PDF时将多页内容附加到PDF中(方法越通用越好)。有没有一种方法可以使用Document. Add()写入文档,而不是必须复制模板页面并在它们的顶部写入?

(注意,代码是c#)

共有1个答案

太叔烨霖
2023-03-14

此答案基于iTextSharp留档中的示例,但转换为C#。

为了使添加的文本跨越多个页面,我发现可以使用ColumnText。HasMoreText(ct.Go())告诉我是否有超过当前页面所能容纳的文本。然后可以保存当前页面,重新创建新页面模板,并将columntext移动到新页面。下面是一个名为CheckForNewPage的函数:

    private bool CheckForNewPage(PdfCopy copy, ref PdfImportedPage page, ref PdfCopy.PageStamp stamp, ref PdfReader templateReader, ColumnText ct)
    {
        if (ColumnText.HasMoreText(ct.Go()))
        {
            //Write current page
            stamp.AlterContents();
            copy.AddPage(page);

            //Start a new page
            ct.SetSimpleColumn(36, 36, 559, 778);
            templateReader = new PdfReader("template.pdf");
            page = copy.GetImportedPage(templateReader, 1);
            stamp = copy.CreatePageStamp(page);
            ct.Canvas = stamp.GetOverContent();
            ct.Go();
            return true;
        }
        return false;
    }

每次将文本添加到ct变量时,都应调用此函数。

如果CheckForNewPage返回true,您可以增加页面计数,并将y变量重置为新页面的顶部,以便链接注释在新页面的正确位置。

例如。

var tocPageCount = 0;


var para = new iTextSharp.text.Paragraph(documentName);
ct.AddElement(para);
ct.Go();
if (CheckForNewPage(context, copy, ref page, ref stamp, ref tocReader, ct))
{
    tocPageCount++;
    y = 778;
}

//Add link annotation
action = PdfAction.GotoLocalPage(d.DocumentID.ToString(), false);
link = new PdfAnnotation(copy, TOC_Page.Left, ct.YLine, TOC_Page.Right, y, action);
stamp.AddAnnotation(link);
y = ct.YLine;

这将正确创建页面。下面的代码调整了ToC2示例的结尾以重新排序页面,以便处理超过1页。

var rdr = new PdfReader(baos.toByteArray()); 
var totalPageCount = rdr.NumberOfPages;
rdr.SelectPages(String.Format("{0}-{1}, 1-{2}", totalPageCount - tocPageCount +1, totalPageCount, totalPageCount - tocPageCount));
PdfStamper stamper = new PdfStamper(rdr, new FileStream(outputFilePath, FileMode.Create));
stamper.Close();

通过重新使用CheckForNewPage功能,您应该能够将任何内容添加到您创建的新页面中,并使其跨越多个页面。如果不需要注释,则在添加所有内容结束时,在循环中调用CheckForNewPage(只需事先不要调用ct.Go())。

 类似资料:
  • 问题内容: 我正在使用iText 通过使用PDFCopy合并多个PDF 来创建 单个PDF 。我需要在本文档的开头创建一个 目录 (不是书签),并带有指向每个源PDF的第一页的可单击链接。 合并PDF的代码 问题答案: 您在要求一些琐碎的事情,但事实并非如此。请看一下MergeWithToc示例。您会看到合并PDF的代码是正确的,但是在我的示例中,我添加了一个额外的功能: 对于每个首页,我都将一个

  • null 有人能解释一下,当我使用PdfReader阅读模板后,我如何制作模板的副本吗?有没有办法把表格写到模板副本上,而不是一个新文档上? 为了将来的参考,我做了以下工作:

  • 问题内容: 我使用itext将pdf转换为文本文件,它实际上工作良好,但是对于某些词它可以完成以下操作:例如,在pdf中,有诸如“ present the main idea”之类的短语,但是itext创建了诸如“ presentthemainideas”之类的输出。无论如何,有没有纠正这种行为? 问题答案: 缺少空格字符的原因是,您在渲染的PDF中看到的空格不一定与PDF页面内容描述中的空格相对

  • 我正在尝试将多个pdf页面合并为一个pdf页面。有很多iText的例子展示了如何将pdf页面合并到一个文件中,但是我需要所有的页面都放在一个页面中(一路上缩小它们的宽度和高度) 编辑:尝试从这里这个代码,但它只是合并成一个文件的pdf页面,我需要他们收缩成一个单一的页面

  • 问题内容: 使用iText合并不同宽度的文档时出现问题。 下面是我用来合并的代码。 pdf的首页宽度为14英寸,高度为13英寸。文档上的所有其他页面将始终小于该页面。 我想将所有文档全部合并到一个文档中。 我不知道如何设置单个合并文档的宽度和高度。 我认为应该这样做,但是如果将其更改为,文档无效将不起作用。 请进一步指导我。 问题答案: 使用类合并文档违反了 官方 文档中的所有建议,尽管有一些 非

  • 我在Android日食中使用 itext 创建 pdf 时遇到问题 如果给定了引导入口,我无法创建pdf,在我的情况下是Android 5.0.1。如果我删除了bootstrap条目,我可以创建pdf,但不能启动活动,因为android 5.0.1包含android jar。你能告诉我如何解决这个问题吗?同样,如果我把它变成一个非活动类,我希望能够在另一个活动类中创建一个非活动类的对象,这样我就可