itext измените уровень масштабирования всех гиперссылок, чтобы наследовать масштабирование в существующем pdf

#java #itext

#java #itext

Вопрос:

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

возможно, я допустил какую-то ошибку в PdfName.DEST и условие, потому что в pdf для первой страницы нет массива DEST (посмотрите снимок экрана).

 for (int count = 0; count < reader.getNumberOfPages(); count  ) {
        PdfDictionary page = reader.getPageN(count 1);
        PdfArray annots = page.getAsArray(PdfName.ANNOTS);
        if (annots != null) {
            for (int i = 0; i < annots.size(); i  ) {
                PdfDictionary annotation = annots.getAsDict(i);
                if (PdfName.LINK.equals(annotation.getAsName(PdfName.SUBTYPE))) {
                     if(annotation.get(PdfName.A)==null){
                          continue;
                     }
                    PdfArray d = annotation.getAsArray(PdfName.DEST);
                    if (d != null amp;amp; d.size() == 5 amp;amp; PdfName.XYZ.equals(d.getAsName(1)))
                        d.set(4, new PdfNumber(0));
                }
            }
        }
    }
  

Я создал ссылку с первой страницы на вторую страницу, проверьте структуру на изображении.

введите описание изображения здесь

Я также попытался использовать следующий код… у меня есть debug, и каждый раз значение проверки d равно нулю

 for (int count = 0; count < reader.getNumberOfPages(); count  ) {
            PdfDictionary page = reader.getPageN(count 1);
            PdfArray annots = page.getAsArray(PdfName.ANNOTS);
            if (annots != null) {
                for (int i = 0; i < annots.size(); i  ) {
                    PdfDictionary annotation = annots.getAsDict(i);
                    if (PdfName.LINK.equals(annotation.getAsName(PdfName.SUBTYPE))) {

                        PdfArray d = annotation.getAsArray(PdfName.DEST);
                        // d is null every time
                    }
                }
            }
        }
  

Ответ №1:

Вы добавляете снимок экрана, который позволяет вам заглянуть внутрь PDF. На этом снимке экрана вы ясно видите, что адресатом является [5 0 R, /FitH, 795] . Однако вы изменяете коэффициент масштабирования только для адресатов, которые состоят из 5 значений и имеют тип /XYZ .

  if (d != null amp;amp; d.size() == 5 amp;amp; PdfName.XYZ.equals(d.getAsName(1)))
      d.set(4, new PdfNumber(0));
  

[5 0 R, /FitH, 795] имеет 3 элемента (другими словами d.size() == 5 , is false ), а первая запись в массиве равна PdfName.FITH (другими словами PdfName.XYZ.equals(d.getAsName(1) , false).

Ваш вопрос должен быть отклонен, потому что вы показываете одно, затем делаете что-то еще, а затем спрашиваете нас, почему вы не получаете ожидаемый результат. Это как если бы кто-то подал вам суп, и вы увидели ложку и вилку на столе. Несмотря на то, что вы знаете, что суп нужно есть ложкой, вы берете вилку, а затем жалуетесь, что не можете есть суп вилкой. Это … странно.

Обновление В комментариях вы жалуетесь, что d это null так, но, глядя на снимок экрана, вы уже знали, что d это значение равно нулю.

Вы перебираете страницы и получаете словарь страниц для страницы 1 (объект 4). Вы проверяете, есть ли /Annots запись в словаре этой страницы. Существует (объект 40). Вы перебираете аннотации и сталкиваетесь со словарем аннотаций (объект 30 или 39, разрешение снимка экрана слишком плохое, чтобы я мог видеть). Вы проверяете, есть ли /Subtype Link . Это так. Вы проверяете, есть ли в аннотации /A запись. Он имеет. Затем вы получите /Dest запись. Такой записи нет. Следовательно, вы получаете null . Пункт назначения находится здесь:

 PdfDictionary action = annotation.get(PdfName.A);
if (action != null) {
    PdfArray d = action.getAsArray(PdfName.D);
    // now examine and change D
}
  

Обратите внимание, что вы просите сообщество SO написать ваше приложение вместо вас. Вам платят за это решение, но вы ожидаете, что другие люди будут выполнять вашу работу вместо вас. Более того: у вас, вероятно, нет коммерческой лицензии на iText…

Комментарии:

1. На самом деле я хочу изменить все свойства ссылок, чтобы наследовать масштабирование. извините, но я плохо говорю по-английски.

2. я также получаю null в d перед этим условием.

3. PdfArray d = annotation.getAsArray(PdfName. DEST); всегда возвращает null.

4. PdfDictionary action = annotation.get(PdfName.A); — Исключение ClassCast

5. я использую itext для своего небольшого семестрового проекта. вот почему у меня нет коммерческой лицензии itext.