Установить BaseUrl существующего документа PDF

У нас возникли проблемы с установкой BaseUrl с помощью iTextSharp. В прошлом для этого мы использовали реализацию Adobe, но у нас возникли серьезные проблемы с производительностью. Поэтому мы перешли на iTextSharp, который примерно в 10 раз быстрее. Adobe позволила нам установить базовый URL-адрес для каждого документа. Нам это очень нужно для того, чтобы развернуть наши документы на разных серверах. Но мы не можем найти правильный код для этого.

Этот код мы использовали с Adobe:

public bool SetBaseUrl(object jso, string baseUrl)
{
    try
    {
        object result = jso.GetType().InvokeMember("baseURL", BindingFlags.SetProperty, null, jso, new Object[] {baseUrl });
        return result != null;
    }
    catch
    {
        return false;
    }
}

Многие решения описывают, как вы можете вставлять ссылки в новые или пустые документы. Но наши документы уже существуют и содержат не только текст. Мы хотим наложить определенные слова на ссылку, которая ведет к одному или нескольким другим документам. Поэтому для нас очень важно, чтобы мы могли вставить ссылку, не обращаясь к самому тексту. Может быть, положить коробку поверх этих слов и установить ее положение (поскольку мы знаем, где слова расположены в документе).

Мы пробовали разные реализации, используя метод setAction, но, похоже, он не работает должным образом. В результате в большинстве случаев мы выпиливали коробку, но не было связи внутри или связанной с ней. (курсор не изменился и ничего не произошло, когда я щелкнул внутри поля)

Любая помощь приветствуется.


person Chrisi    schedule 04.07.2014    source источник
comment
Можете ли вы поделиться с нами PDF-файлом с BaseUrl и файлом без BaseUrl? Или объясните, как вы определили BaseUrl, используя реализацию Adobe. Или еще лучше: не могли бы вы указать мне раздел в ISO-32000-1, где описывается концепция? Я знаю концепцию базового URL-адреса в HTML, но не думаю, что сталкивался с ней в контексте PDF. Как только мы увидим его в спецификациях, мы сможем легко добавить его в iText.   -  person Bruno Lowagie    schedule 04.07.2014
comment
К сожалению, я не могу поделиться с вами ни одним из документов, о которых идет речь, поскольку они содержат конфиденциальную информацию. Я добавил пример кода нашей реализации Adobe, но все, что он делает, это устанавливает свойство baseURL объекта JavaScript, как описано в этой документации: adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/   -  person Chrisi    schedule 04.07.2014
comment
Хорошо, это выглядит прямолинейно. В зависимости от времени, которое у меня есть, я приготовлю вам несколько примеров. Тот, где я создаю PDF с нуля, вводя BaseURL. Еще один, где я адаптирую существующий PDF.   -  person Bruno Lowagie    schedule 04.07.2014
comment
Я уже провел некоторые эксперименты, но у меня через минуту встреча, поэтому я пока не могу ничего публиковать. Однако я уже выяснил, что настройка baseURL работает только при просмотре PDF в Acrobat. В Reader возникает следующее исключение: NotAllowedError: настройки безопасности запрещают доступ к этому свойству или методу. Doc.baseURL:1:Document-Level:0000000000000000   -  person Bruno Lowagie    schedule 04.07.2014


Ответы (1)


Я сделал вам пару примеров.

Сначала рассмотрим BaseURL1. В своем комментарии вы упомянули JavaScript, поэтому я создал документ, в который добавил фрагмент JavaScript уровня документа:

writer.addJavaScript("this.baseURL = \"http://itextpdf.com/\";");

Это отлично работает в Adobe Acrobat, но когда вы пытаетесь сделать это в Adobe Reader, вы получаете следующую ошибку:

NotAllowedError: настройки безопасности запрещают доступ к этому свойству или методу. Doc.baseURL: 1: Уровень документа: 0000000000000000

Это согласуется со справочником по JavaScript для Acrobat, где четко указано, что для изменения базового URL-адреса необходимы специальные разрешения.

Поэтому вместо того, чтобы следовать предложенному вами пути, я проконсультировался с ISO-32000-1 (это то, о чем я вас просил, но... я превзошел вас в скорости).

Я обнаружил, что вы можете добавить словарь URI в каталог с записью Base. Поэтому я написал второй пример, BaseURL2, где я добавляю этот словарь в корневой словарь PDF-файла. :

PdfDictionary uri = new PdfDictionary(PdfName.URI);
uri.put(new PdfName("Base"), new PdfString("http://itextpdf.com/"));
writer.getExtraCatalog().put(PdfName.URI, uri);

Теперь BaseURL работает как в Acrobat, так и в Reader.

Предполагая, что вы хотите добавить BaseURL к существующим документам, я написал BaseURL3. В этом примере мы добавляем тот же словарь в корневой словарь существующего PDF-файла:

PdfReader reader = new PdfReader(src);
PdfDictionary uri = new PdfDictionary(PdfName.URI);
uri.put(new PdfName("Base"), new PdfString("http://itextpdf.com/"));
reader.getCatalog().put(PdfName.URI, uri);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();

Используя этот код, вы можете изменить ссылку, указывающую на "index.php" (base_url.pdf).) в ссылку, указывающую на "http://itextpdf.com/index.php. " (base_url_3.pdf).

Теперь вы можете заменить свою лицензию Adobe на более дешевую лицензию iTextSharp ;-)

person Bruno Lowagie    schedule 04.07.2014
comment
Работает как шарм. Большое тебе спасибо - person Chrisi; 07.07.2014
comment
Это был хороший вопрос, потому что, ответив на него, я узнал то, чего еще не знал. - person Bruno Lowagie; 08.07.2014
comment
Ссылки на эти примеры PDF-файлов не работают. Не могли бы вы обновить их? Спасибо. - person Olivier Cailloux; 03.01.2021