2015-11-28 85 views
0

我一直在使用PDFBox 1.8來處理pdf。現在我打算轉移到PDFBox 2.0-RC-2。我在遷移時遇到了一些麻煩。從PDFBox 1.x移動到PDFBox 2

隨着PDFBox的1.8,我用來獲取從PDPage令牌使用:

PDStream contents = page.getContents(); 
PDFStreamParser parser = new PDFStreamParser(contents.getStream()); 
parser.parse(); 
List<Object> tokens = parser.getTokens(); 

然而,page.getContents()返回PDFBox的2的InputStream如何獲得PDStream?我應該使用page.getContentStreams()(它返回Iterable)並遍歷它嗎?另外,構造函數new PDFStreamParser(COSStream)似乎已被棄用。

我的另一個問題是圖像替換。我在PDFBox的2.0與另一使用replaceWithStream

PDResources resources = page.getResources(); 
Iterable<COSName> xObjectNames = resources.getXObjectNames(); 
if (null != xObjectNames) { 
    for(COSName xObjectName : xObjectNames){ 
     PDXObject object = resources.getXObject(xObjectName); 
     if (object instanceof PDImageXObject) { 
      PDImageXObject img1 = (PDImageXObject) object; 
      PDImageXObject img2 = .... 
      img1.getCOSStream().replaceWithStream(
        img2.getCOSStream()); 
     } 
    } 
} 

replaceWithStream方法在PDFBox的1.8棄用替換一個圖像,因此,它已被完全去除。用img2替代img1的另一種方式是什麼?

回答

2

回答這個問題的第一部分:

PDFStreamParser parser = new PDFStreamParser(page); 
parser.parse(); 
List<Object> pageTokens = parser.getTokens(); 

回答這個問題的第二部分:

如果兩個圖像具有相同的過濾器應該怎樣工作,大小等是這樣的:

OutputStream os = img1.getCOSStream().createRawOutputStream(); 
InputStream is = img2.getCOSStream().createRawInputStream(); 
IOUtils.copy(is, os); 
is.close(); 
os.close(); 

更新: 如果它們不相同,也這樣做:

COSStream c1 = img1.getCOSStream(); 
COSStream c2 = img2.getCOSStream(); 
for (COSName name : c1.keySet()) 
{ 
    c1.setItem(name, null); 
} 
for (COSName name : c2.keySet()) 
{ 
    c1.setItem(name, c2.getItem(name)); 
}     
+0

有關@drunkenfist遺憾。我會在明天進行調查(現在是午夜)。舊圖像和新圖像是什麼類型的圖像? (jpeg,pixelmap,ccitt?) –

+0

對不起,剛纔注意到IOUtils.copy沒有按預期工作。當我嘗試打開PDF時,出現錯誤,提示圖像數據不足。當我使用replaceWithStream時,它在1.8版本中工作得更早。我可以看到InputStream具有內容。我是否需要以某種方式將OutputStream寫回pdf?我不假設。 – drunkenfist

+0

@drunkenfist顯然你需要保存PDF。你可能用1.8來做什麼。 –

0

回答的提問(由我自己測試)的第二部分:

InputStream is = img2.getStream().getCOSObject().createRawInputStream(); 
OutputStream os = img1.getStream().getCOSObject().createRawOutputStream(); 

IOUtils.copy(is, os); 
is.close(); 
os.close(); 

img1.getStream().getCOSObject().clear(); 
img1.getStream().getCOSObject().addAll(img2.getStream().getCOSObject().asUnmodifiableDictionary());