iText: настройка интерполяции изображений для изображений на странице - PullRequest
1 голос
/ 25 января 2011

Я хочу перебрать страницы PDF и написать новый PDF, где для всех изображений установлена ​​интерполяция false. Я ожидал, что смогу сделать что-то вроде следующего, но не могу найти способ доступа к изображениям или прямоугольникам на странице PDF.

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

1 Ответ

0 голосов
/ 28 января 2011

Это будет не так просто.Там нет высокоуровневый способ делать то, что вы хотите.Вам нужно будет перечислить ресурсы, ищущие изображения XObject, и очистить их флаг / 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.Все функции getAs* будут возвращать ноль, если данный ключ отсутствует или имеет другой тип ... Вы понимаете.

...