1

使用 .NET 应用程序,我正在尝试创建一个引用其他文件的 PDF“目录”,例如在 DVD 上分发的文件等。

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

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

formFields.ExecuteThisJavascript(js);

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

在 Acrobat 中,这是在“高级”文档属性中设置的:

Acrobat 文档属性

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

PDF结构

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

4

2 回答 2

0

在这里回答我自己的问题......我能够使用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;
    }
于 2018-07-04T16:05:42.130 回答
0

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

于 2018-07-02T10:57:23.760 回答