iText系列之PdfCopy和PdfSmartCopy

      一个PDF文件是由一系列的对象组成的,比如说一个PDF文件中的图片是由键值对形式的字典组成的一个流对象,而这个流对象是由stream和endstream这两个词来界定的。

      那么,如果我们现在在不同的两个页面上,都有一个相同的图片,我们需要避免重复的信息存储,这样一来,就可以达到优化和压缩PDF文件的大小的目的。

我们来看看这两个对象是怎么做的:

  • PdfCopy:它会存储两个不同的图片流对象,在索引表中会引用两次,因此虽然是一个相同的图片,但是在不同的页面上会分别显示对应的图片。
  • PdfSmartCopy:经过它处理,会重建索引表,会把这个图片流对象引用到不同的页面上,而这个图片对象只存储了一份。

 

      由此看来,PdfCopy处理的比较快,但是生成的PDF文件的大小会很大,很臃肿。而PdfSmartCopy处理文档比较慢,也会消耗更多的内存,但是生成的PDF文件大小会很小。

      因此,在实际使用中,为了控制大小,一般会使用PdfSmartCopy来对PDF文件进行处理。

      例如:

public static void compressPdf(byte[] pdf, OutputStream out) throws Exception {
	PdfReader reader = null;
	PdfSmartCopy copy = null;
	Document document = null;
	try {
		document = new Document();
		copy = new PdfSmartCopy(document, out);
		reader = new PdfReader(pdf);
		int n = reader.getNumberOfPages();
		document.open();
		for (int i=1; i<=n; i++) {
			document.newPage();
			PdfImportedPage imported = copy.getImportedPage(reader, i);
			copy.addPage(imported);
		}
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		if (document != null)
			document.close();
		if (reader != null)
			reader.close();
		if (copy != null)
			copy.close();
	}
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章