java - iText 的 getPageN() 和 getPageNRelease() 调用有什么区别?

标签 java pdf itext

我想知道这个有一段时间了。 PdfReader 中有两个获取页面字典的调用:getPageN() 和 getPageNRelease()。

我们应该在什么情况下使用其中一种?

两者对性能有影响吗?

例如,我有一个算法可以迭代现有 PDF 中的每一页并从中读取数据。我应该使用哪个调用?

最佳答案

主要是,如果你想更改你检索的页面对象,希望更改不是易变的(但要出现在例如 PdfStamper 的输出中,你将应用于 PdfReader 问题),你应该使用 getPageN()。如果检索页面只是为了从中读取信息,则应使用 getPageNRelease()


有什么区别?好吧,首先只有当你有一个以部分模式运行的 PdfReader 实例时才会有区别,即如果它没有解析整个 PDF 启动时,但只有那些基本理解所讨论的 PDF 所需的对象。否则,即如果 PDF 已被完全解析,则两种方法有效地执行相同的操作。

如果在此模式下工作,

  • 您使用 PdfReader.getPageN() 检索的页面被添加到内部缓存;因此,如果您稍后再次查询同一页面,您将检索到相同的对象,包括您应用的所有更改,在该阅读器上运行的 PdfStamper 也是如此;
  • 但是您在检索后立即使用 PdfReader.getPageNRelease() 检索的页面会再次从该缓存中删除(除非该页面之前已经被检索并添加到该缓存中)。

这样做是因为您通常使用局部模式来最小化内存中的 PDF 部分。因此,如果您检索页面只是为了从中读取内容,那么在您阅读完所需信息后,页面包含的对象可以再次从内存中删除。

但请不要指望通过 PdfReader.getPageNRelease() 读取的页面是易变的:如果不使用部分模式,如果页面在使用之前已经被检索过 PdfReader.getPageN(),或者如果之前调用过 PdfReader.setTampered()


可以使用以下构造函数之一激活部分模式

public PdfReader(final RandomAccessFileOrArray raf, final byte ownerPassword[]) throws IOException

public PdfReader(final RandomAccessFileOrArray raf, final byte ownerPassword[], boolean partial)

public PdfReader(final String filename, final byte ownerPassword[], boolean partial) throws IOException

并且(在后两者的情况下)使用partial 参数值true。没有其他构造函数允许选择部分模式。


OP 在评论中提问

we are using partial mode. Does getPageN() followed later by a call to reader.releasePage() have the same effect?

是的,也许。

,因为getPageNRelease()是这样实现的

public PdfDictionary getPageNRelease(final int pageNum) {
    PdfDictionary dic = getPageN(pageNum);
    pageRefs.releasePage(pageNum);
    return dic;
}

releasePage()这样

public void releasePage(final int pageNum) {
    pageRefs.releasePage(pageNum);
}

因此,getPageNRelease() 实际上与 getPageN 加上 releasePage() 相同。

也许,因为您不应该在这些方法调用之间等待太久。特别是您不应该同时请求另一个页面,因为只能释放最近获取的页面。

关于java - iText 的 getPageN() 和 getPageNRelease() 调用有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39259494/

相关文章:

java - 在 Java 中初始化泛型

java - 扩展 JPA 实体以添加属性和逻辑

java - 当 V 是 T 中的属性对象时,如何将数组 T[] 转换为 V[]

c# - 不使用第 3 方工具从头开始开发 Word 到 PDF 转换器

c# - 在 C# 中读取 PDF

java - 将struts web项目升级到java 1.7

java - 强制Java编译器假设所有变量都是final的

javascript - 如何使用html5和jquery在网页中显示pdf内容?

pdf - 如何在 Stamper 中使用 Verdana 字体 (iText PDF)

java - IText 将文档与 acrofields 合并