2011-01-25 4 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(). Любые предложения о том, как я мог бы сделать то же самое?

Приветствия

Nik

ответ

0

Это не будет легко. Нет способа высокого уровня делать то, что вы хотите. Вам нужно будет перечислить ресурсы, которые ищут XObject Images, и очистить их/Interpolate.

И вам нужно будет сделать это, прежде чем создавать PdfImportedPage, потому что нет открытого способа доступа к их ресурсам. Grr.

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 Forms. Все функции getAs* возвращают значение null, если данный ключ отсутствует или другого типа ... вы получаете идею.