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

时间:2016-08-31 21:45:00

标签: java pdf itext

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

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

是否存在性能影响?

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

1 个答案:

答案 0 :(得分:2)

首先,如果您想要更改您检索的页面对象,期望更改不会变化(但要显示在PdfStamper的输出中,您将适用于PdfReader in问题),你应该使用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在评论中提到

  

我们正在使用偏模式。稍后通过调用reader.releasePage()跟随getPageN()会产生相同的效果吗?

是的,也许。

,因为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()实际上与getPageNreleasePage()相同。

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