如何将搜索目录文件 (.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" 文档属性中设置的:
但是,这不能通过文档的 info
或 metadata
属性访问。
显然这是存储在其他地方,但我对 PDF 格式了解不够,无法弄清楚如何访问此数据:
如有任何帮助,我们将不胜感激。我可以同时使用 Adobe SDK/JavaScript API 或其他一些库(例如,我知道我们已经拥有 Aspose 许可证)。
/搜索条目未记录在 PDF 规范中,可能是 Adobe 扩展。
您可以使用任何支持低级 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;
}
我正在尝试使用 .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" 文档属性中设置的:
但是,这不能通过文档的 info
或 metadata
属性访问。
显然这是存储在其他地方,但我对 PDF 格式了解不够,无法弄清楚如何访问此数据:
如有任何帮助,我们将不胜感激。我可以同时使用 Adobe SDK/JavaScript API 或其他一些库(例如,我知道我们已经拥有 Aspose 许可证)。
/搜索条目未记录在 PDF 规范中,可能是 Adobe 扩展。
您可以使用任何支持低级 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;
}