Itext: установить уровень масштабирования внешней гиперссылки в pdf

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

Chunk chunk = new Chunk("Click to Open File");

PdfAction action = new PdfAction("externalfile.pdf");
action.put(PdfName.NEWWINDOW, PdfBoolean.PDFTRUE);
action.put(PdfName.ZOOM, PdfName.FIT);
chunk.setAction(action);

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

Я пытался использовать action.put(PdfName.ZOOM, PdfName.FIT);, но это не работает.


person Butani Vijay    schedule 14.04.2015    source источник


Ответы (1)


Пожалуйста, никогда не создавайте объект PDF вручную, не ознакомившись с ISO-32000-1.

Вы хотите создать действие GoToR. Такое действие выражается в виде словаря PDF, который может содержать следующие ключи:

ISO-32000-1 Таблица 200

В этой таблице нет клавиши с именем Zoom, поэтому ваш код неверен.

Вам понадобится клавиша D, а поскольку вы хотите создать ссылку на страницу и определить коэффициент масштабирования, вам необходимо указать пункт назначения:

ISO-32000-1 Таблица 151

Другими словами, пункт назначения должен быть PdfArray! PdfName.FIT недостаточно!

(Все снимки экрана взяты из копии ISO-32000-1, предоставленной Adobe на ее веб-сайте.)

Обновление:

Если вы хотите добавить ссылку на удаленную страницу, вы также можете следовать примеру на странице 197-198 в iText в действии - Второе издание: см. пример LinkActions, в котором используется gotoRemotePage().

Внутренне этот метод выглядит так:

public static PdfAction gotoRemotePage(String filename, String dest, boolean isName, boolean newWindow) {
    PdfAction action = new PdfAction();
    action.put(PdfName.F, new PdfString(filename));
    action.put(PdfName.S, PdfName.GOTOR);
    if (isName)
        action.put(PdfName.D, new PdfName(dest));
    else
        action.put(PdfName.D, new PdfString(dest, PdfObject.TEXT_UNICODE));
    if (newWindow)
        action.put(PdfName.NEWWINDOW, PdfBoolean.PDFTRUE);
    return action;
}

Обратите внимание, что это предполагает, что у вас есть именованный пункт назначения в целевом файле.

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

public PdfAction(String filename, int page) {
    put(PdfName.S, PdfName.GOTOR);
    put(PdfName.F, new PdfString(filename));
    put(PdfName.D, new PdfLiteral("[" + (page - 1) + " /FitH 10000]"));
}

Конечно, это не использует PdfName.FIT. Если вы действительно хотите определить место назначения самостоятельно, вам нужна строка, которая выглядит так:

put(PdfName.D, new PdfLiteral("[" + (page - 1) + " /Fit]"));
person Bruno Lowagie    schedule 14.04.2015
comment
Я пробовал это chunk.setAction(PdfAction.gotoRemotePage(filepath,1, false, true)); - person Butani Vijay; 14.04.2015
comment
Это действительно проще, чем пытаться создать PdfAction вручную. Добавлю ссылку на официальную документацию, где описан метод. - person Bruno Lowagie; 14.04.2015
comment
Я не думаю, что ты понимаешь, что делаешь. Если 1 является именованным пунктом назначения в вашем целевом PDF-файле, вы знаете, что делаете. Если 1 - это номер страницы, то вы не читали мой ответ. - person Bruno Lowagie; 14.04.2015
comment
Я еще раз обновил свой ответ, чтобы показать, почему вы неправильно интерпретируете документацию API. - person Bruno Lowagie; 14.04.2015
comment
Спасибо Бруно. Понятно. - person Butani Vijay; 14.04.2015