如何将搜索目录文件 (.pdx) 与 PDF 文档相关联

How to associate search catalog file (.pdx) with PDF document

我正在尝试使用 .NET 应用程序创建一个引用其他文件的 PDF "table of contents",就像在 DVD 上分发的文件等

为此,我需要一个搜索索引和目录,以便跨文档进行全文搜索。 我已经能够通过复制 "old" .pdx 文件(目录结构始终相同)然后从 C# 调用 JavaScript 来自动构建索引:

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

formFields.ExecuteThisJavascript(js);

但是我如何才能将 .pdx 文件与我的 .pdf 文档相关联,以便它自动加载?

在 Acrobat 中,这是在 "advanced" 文档属性中设置的:

但是,这不能通过文档的 infometadata 属性访问。 显然这是存储在其他地方,但我对 PDF 格式了解不够,无法弄清楚如何访问此数据:

如有任何帮助,我们将不胜感激。我可以同时使用 Adob​​e SDK/JavaScript API 或其他一些库(例如,我知道我们已经拥有 Aspose 许可证)。

/搜索条目未记录在 PDF 规范中,可能是 Adob​​e 扩展。
您可以使用任何支持低级 COS 对象(字典、字符串、数字、流等)的库,但由于没有记录该条目,您只能从示例 PDF 文件中推断其结构。

在这里回答我自己的问题...我能够使用 PdfSharp 解决这个问题。

以下代码与 PdfSharp 1.50.4845-RC2a 兼容。

pdxFile 应该是 .pdx 文件的名称,包括文件扩展名(例如 "catalog.pdx")。我只使用与 PDF 文档位于同一文件夹中的 .pdx 文件对此进行了测试,但我认为通常相对路径应该有效。

不能保证这是一个完美的解决方案,因为我对 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;
    }