【问题标题】:Strip Adobe Reader and Version requirements from PDF before outputting it to browser在将 PDF 输出到浏览器之前,从 PDF 中去除 Adob​​e Reader 和版本要求
【发布时间】:2013-01-31 23:18:38
【问题描述】:

我计划使用pdf.js 通过带有 Javascript 的浏览器获取 PDF 上下文。问题是我正在使用的某些 PDF 需要具有特定版本的 Adob​​e 阅读器。 pdf.js 还不(曾经?)支持这些欺骗。我需要知道的是 C# 中是否有办法打开 PDF 并删除这些阅读器和版本要求以及如何做到这一点。我正计划使用itextsharp 在服务器端进行其他 PDF 操作,因此使用它的示例将是最有帮助的。我计划通过 MVC 4 将这些作为来自 ajax 请求的ActionResult 提供,因此在此操作结束时MemoryStream 将是最有帮助的。

【问题讨论】:

  • 您必须打开 pdf(在内存中),然后使用您在 C# 程序中读取 pdf 的任何进程保存一份副本。如果您可以控制 pdf 文件(我假设您没有),您也可以只使用 Acrobat 来执行此操作。
  • 我理解这部分......我很好奇的是我必须从“内存中”副本中删除什么以删除版本和读者要求
  • OK - 所以你不想只删除版本号:-)。我将删除我的答案。
  • 请详细说明为什么您的 pdf 文件需要某些特定版本的 adobe reader。我看到了多种可能的原因:1)PDF 本身包含测试版本的 JavaScript 代码,并且仅在某些给定版本激活某些内容的情况下 2)PDF 包含 XFA 表单,读者首先必须将其翻译成页面。如果您不确定,请提供 PDF 以供检查。
  • 美国公民及移民服务局N-400

标签: c# asp.net-mvc pdf pdf.js


【解决方案1】:

所以最后pdf.js 也无法做我需要的事情,但是,我能够做的是将Xfa/Pdf 转换为C# 对象,然后根据需要通过Json 将页面发送到我的用于在HTML5 Canvas 中呈现的 Javascript。下面的代码在itextsharp 的帮助下获取一个 xfa-in-a-pdf 文件并将其转换为 C# 对象:

    PdfReader.unethicalreading = true;
    PdfReader reader = new PdfReader(new FileStream(Statics.PdfUploadLocation + PdfFileName, FileMode.Open, FileAccess.Read));

    XfaForm xfaForm = new XfaForm(reader);
    XDocument xDoc = XDocument.Parse(xfaForm.DomDocument.InnerXml);

    string xfaNamespace = @"{http://www.xfa.org/schema/xfa-template/2.6/}";


    List<XElement> formPages = xDoc.Descendants(xfaNamespace + "subform").Descendants(xfaNamespace + "subform").ToList();
    TotalPages = formPages.Count();


    var fieldIndex = 0;
    RawPdfFields = new List<XfaField>();

    for (int page = 0; page < formPages.Count(); page++)
    {
        RawPdfFields.AddRange(formPages[page].Descendants(xfaNamespace + "field")
                    .Select(x => new XfaField
                    {
                        Page = page,
                        Index = fieldIndex++,
                        Name = (string)x.Attribute("name"),
                        Height = GetUnitFromPossibleString((string)x.Attribute("h")),
                        Width = GetUnitFromPossibleString((string)x.Attribute("w")),
                        XPosition = GetUnitFromPossibleString((string)x.Attribute("x")),
                        YPosition = GetUnitFromPossibleString((string)x.Attribute("y")),
                        Reference = GetReference(x.Descendants(xfaNamespace + "traverse")),
                        AssistSpeak = GetAssistSpeak(x.Descendants(xfaNamespace + "speak"))
                    }).ToList());
    }

【讨论】:

    【解决方案2】:

    您的 PDF 文件 n-400.pdf 使用 Adobe XML Forms Architecture (XFA)。这意味着您需要一个也支持XFA 的查看器,而 pdf.js 似乎不支持。

    这样的 PDF 通常包含一些标准的 PDF 内容,这表明 PDF 需要一些支持 XFA 的查看器。在您的情况下,内容包含

    如果此消息最终没有被文档的正确内容替换,您的 PDF 查看器可能无法显示此类文档。

    这实际上表明了启用 XFA 的查看器的作用,它根据 XFA XML 数据中的信息呈现一些页面并显示它而不是 PDF 样式的页面描述。

    虽然由 Adob​​e 专有定义,但 PDF specification ISO 32000-1 描述了如何将 XFA 数据嵌入到 PDF 文档中,参见。第 12.7.8 节 XFA 表格。

    如果您只需要这些处于展平状态的表单,您可能需要查看iText Demo: Dynamic XFA forms in PDF

    【讨论】:

    • 我会接受您的回答,因为它回答了我的问题,但是请参阅我的回答,了解我真正想要的内容......
    • @SerjSagan 您是否确定在您的用例中将 XFA 内容展平为常规 PDF 是否可行?如果是这样,您应该真正研究一下 iText 演示:PDF 中的动态 XFA 表单 的扁平化功能,该功能演示了该功能。扁平化的结果很有可能被 pdf.js 显示。但是,如果您在答案中提到的程序对您有用,那也没关系。
    猜你喜欢
    • 2012-02-23
    • 2012-06-17
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多