我想知道这一段时间了。 PdfReader中有两个用于获取页面字典的调用:getPageN()和getPageNRelease()。
我们应该在哪种情况下使用其中一种?
是否存在性能影响?
例如,我有一个算法,它迭代现有PDF中的每个页面并从中读取数据。我应该使用哪个电话?
答案 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()
实际上与getPageN
加releasePage()
相同。
也许,因为您不应该在这些方法调用之间等待太长时间。特别是在此期间您不应该请求另一个页面,因为只能释放最近获取的页面。