2011-01-25 337 views
1

我想遍歷PDF頁面並編寫一個新的PDF,其中所有圖像的插值設置爲false。我期待能夠做到如下所示,但我找不到在PDF頁面上訪問圖像或矩形的方法。iText:爲頁面上的圖像設置圖像插值

PdfCopy copy = new PdfCopy(document, new FileOutputStream(outFileName)); 
copy.newPage(); 
PdfReader reader = new PdfReader(inFileName); 
for(int i = 1; i <= reader.getNumberOfPages(); i++) { 
    PdfImportedPage importedPage = copy.getImportedPage(reader, i); 
    for(Image image : importedPage.images()) 
     image.isInterpolated(false); 
    copy.addPage(importedPage); 
} 
reader.close(); 

但是,沒有PdfImportedPage.images()。有關我如何以其他方式做同樣的建議?

乾杯

回答

0

這不會是那麼容易。沒有高層次的做你想做的事。您必須枚舉查找XObject Images的資源,並清除它們的/ Interpolate標誌。

而您必須在創建PdfImportedPage之前執行此操作,因爲沒有公開的方式來訪問其資源。格兒。

void removeInterpolation(int pageNum) { 
    PdfDictionary page = someReader.getPageN(pageNum); 
    PdfDictionary resources = page.getAsDict(PdfName.RESOURCES); 

    enumResources(resources); 
} 

void enumResource(PdfDictionary resources) { 
    PdfDictionary xobjs = resources.getAsDict(PdfName.XOBJECTS); 

    Set<PdfName> xobjNames = xobjs.getKeys(); 
    for (PdfName name : xobjNames) { 

    PdfStream xobjStream = xobjs.getAsStream(name); 

    if (PdfName.FORM.equals(xobjStream.getAsName(PdfName.SUBTYPE))) { 
     // xobject forms have their own nested resources. 
     PdfDictionary nestedResources = xobjStream.getAsDict(PdfName.RESOURCES); 
     enumResources(nestedResources); 
    } else { 
     xobjStream.remove(PdfName.INTERPOLATE); 
    } 
    } 
} 

在上面的代碼中有相當多的空檢查被忽略。一個頁面不需要有資源字典,儘管他們幾乎總是這樣做。 XObject表單同上。所有的getAs*函數將返回null,如果給定的鍵丟失或不同類型......你明白了。