Как связать файл каталога поиска (.pdx) с документом PDF - PullRequest
0 голосов
/ 02 июля 2018

Используя приложение .NET, я пытаюсь создать «оглавление» в формате PDF, которое ссылается на другие файлы, как если бы они распространялись на DVD и т. Д.

Для этого мне нужен поисковый индекс и каталог, поэтому полнотекстовый поиск будет работать по всем документам. Мне удалось автоматизировать создание индекса, скопировав «старый» файл .pdx (структура каталогов всегда одинакова), а затем вызвав JavaScript из C #:

var js = $@"catalog.getIndex(""{pdxFilePath}"").build('alert(""Hello"")', true)";

formFields.ExecuteThisJavascript(js);

Но как мне связать файл .pdx с моим документом .pdf, чтобы он автоматически загружался?

В Acrobat это задается в «расширенных» свойствах документа:

Acrobat document properties

Однако, это не доступно через свойства info или metadata документа. Очевидно, это хранится где-то еще, но я не знаю достаточно о формате PDF, чтобы выяснить, как получить доступ к этим данным:

PDF structure

Любая помощь будет принята с благодарностью. Я мог бы использовать как Adobe SDK / JavaScript API, так и другую библиотеку (например, я знаю, что у нас уже есть лицензия Aspose).

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

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

Следующий код совместим с PdfSharp 1.50.4845-RC2a.

pdxFile должно быть именем файла .pdx, включая расширение файла (например, "catalog.pdx"). Я проверял это только с файлами .pdx, расположенными в той же папке, что и документ PDF, но я бы предположил, что относительные пути в целом должны работать.

Нет гарантий, что это идеальное решение, так как мне не хватает более глубокого понимания формата PDF, но, похоже, это работает по крайней мере.

    private void SetSearchCatalog(PdfDocument doc, string pdxFile)
    {
        var indexDict = new PdfDictionary(doc);
        indexDict.Elements["/F"] = new PdfString(pdxFile, PdfStringEncoding.RawEncoding);
        indexDict.Elements["/Type"] = new PdfName("/Filespec");

        var indexArrayItemDict = new PdfDictionary(doc);
        indexArrayItemDict.Elements["/Index"] = indexDict;
        indexArrayItemDict.Elements["/Name"] = new PdfName("/PDX");

        var indexArray = new PdfArray(doc, indexArrayItemDict);

        var searchDict = new PdfDictionary(doc);
        searchDict.Elements["/Indexes"] = indexArray;

        doc.Internals.Catalog.Elements["/Search"] = searchDict;
    }
0 голосов
/ 02 июля 2018

/ Запись поиска не задокументирована в спецификации PDF, возможно, это расширение Adobe.
Вы можете использовать любую библиотеку, которая поддерживает низкоуровневые объекты COS (словари, строки, числа, потоки и т. Д.), Но поскольку запись не документирована, ее структуру можно вывести только из примеров файлов PDF.

...