PDFBox: разница между PDPage и PDPageNode

Итак, я новичок в PDFBox, и я пишу класс, который использует эту библиотеку для добавления изображения в определенные координаты на существующей странице документа PDF.

Пока все идет отлично, но меня беспокоит одна вещь.

PDDocument doc = PDDocument.load(pdfFile);
List pages = doc.getDocumentCatalog().getAllPages();
PDPage page = (PDPage) pages.get(pageNumber);

В основном так я получаю конкретную страницу, на которую нужно добавить изображение. Меня беспокоит то, что документация для метода getAllPages () указывает, что он возвращает объекты PDPage и PDPageNode. Пока что в моих тестах я, кажется, получаю только PDPages, так что все прошло хорошо, но я не хочу, чтобы PDPageNode появился однажды и сломал мой код с помощью ClassCastException.

Итак, в чем разница между этими двумя классами и как я могу избежать того, о чем я беспокоюсь?


person user2223059    schedule 11.01.2016    source источник


Ответы (1)


Не волнуйтесь, вы получите объекты PDPage (в 1.8.10). Документ javadoc ясно говорит: «Этот метод вернет плоский список всех объектов PDPage в этом документе», и исходный код в PDPageNode подтверждает это:

    for( int i=0; i<kids.size(); i++ )
    {
        // ignore duplicates (from malformed PDFs)
        if (!seen.contains(kids.get(i)))
        {
            COSBase obj = kids.getObject( i );
            if (obj instanceof COSDictionary)
            {
                COSDictionary kid = (COSDictionary)obj;
                if( COSName.PAGE.equals( kid.getDictionaryObject( COSName.TYPE ) ) )
                {
                    result.add( new PDPage( kid ) );
                }
                else
                {
                    if (recurse)
                    {
                        getAllKids(result, kid, recurse);
                    }
                    else
                    {
                        result.add( new PDPageNode( kid ) );
                    }
                }
            }
            seen.add(kids.get(i));
        }
    }

Если вы только начинаете работать с PDFBox, я рекомендую вам использовать 2.0, API проще:

/**
 * Returns the page at the given index.
 *
 * @param pageIndex the page index
 * @return the page at the given index.
 */
public PDPage getPage(int pageIndex)

Обычному пользователю класс PDPageNode не понадобится. Класс используется, потому что некоторые узлы не являются листами, то есть объекты страницы организованы в виде дерева в PDF-файле, а не в виде списка. Но getAllPages () предоставит вам их в виде списка.

person Tilman Hausherr    schedule 11.01.2016