2013-02-15 2 views
0

Я планирую использовать pdf.js, чтобы иметь контекст PDF через браузер с Javascript. Проблема в том, что некоторые PDF-файлы, которые я использую, требуют Adobe Reader с конкретной версией. pdf.js делает еще (когда-либо?) поддержку подмены их. Мне нужно знать, есть ли способ на C# открыть PDF-файл и удалить эти требования к Reader и версии и как это сделать. Я планировал использовать itextsharp, чтобы делать другие манипуляции с PDF-файлами на стороне сервера, поэтому наиболее полезным будет пример с использованием этого. Я планирую использовать их как ActionResult из запроса ajax через MVC 4, поэтому MemoryStream будет наиболее полезен в конце этой манипуляции.Стриптиз Adobe Reader и требования к версии из PDF до вывода его в браузер

+0

Вы бы должны открыть PDF (в памяти), а затем сохранить копию с помощью которого когда-либо который вы используете для чтения PDF-файла в программе C#. Вы также можете просто использовать Acrobat для этого, если у вас есть контроль над файлами PDF (я полагаю, вы этого не сделали). –

+0

Я понимаю эту часть ... мне любопытно, что мне нужно будет удалить из копии «В память», чтобы удалить требования к версии и читателю –

+0

OK - поэтому вы не хотите просто удалить номер версии: -). Я удалю ответ. –

ответ

1

В файле PDF n-400.pdf используется Adobe XML Forms Architecture (XFA). Это означает, что вам нужен зритель, который также поддерживает XFA, который, по-видимому, отсутствует в файле pdf.js.

Такой PDF-файл обычно содержит некоторый стандартный PDF-контент, который указывает, что в PDF-документе требуется некоторое средство просмотра, поддерживающее XFA. В вашем случае содержание содержит

Если это сообщение не было заменено надлежащим содержимым документа, средство просмотра PDF может не отображать этот тип документа.

Это фактически указывает, что делает просмотрщик, поддерживающий XFA, он отображает некоторые страницы на основе информации в XML-данных XFA и отображает ее вместо описания страниц стиля PDF.

Будучи определенным патентом, Adobe PDF specification ISO 32000-1 описывает, как данные XFA должны быть встроены в документ PDF, ср. раздел 12.7.8 Формы XFA.

Если вам нужны только эти формы в сплющенном состоянии, вы можете взглянуть на iText Demo: Dynamic XFA forms in PDF.

+0

Я приму свой ответ, поскольку он отвечает на мой вопрос, однако, см. Мой ответ за то, что я действительно искал ... –

+0

@SerjSagan Вы определили, нормально ли в вашем случае использовать для выравнивания содержимого XFA в обычный PDF-файл? Если это так, вы должны действительно изучить функцию сглаживания форм * iText Demo: Dynamic XFA в формате PDF *, которая демонстрирует эту функцию. Результат этого сглаживания имеет хорошие шансы быть отображенными pdf.js. Если процедура, которую вы упомянули в своем ответе, работает для вас, это тоже нормально. – mkl

2

Таким образом, в конце концов pdf.js не смогло сделать то, что я нуждался в этом, однако, и то, что я был в состоянии сделать, это преобразовать то Xfa/Pdf к C# объекту отправки страниц по мере необходимости с помощью Json моего Javascript для рендеринга в HTML5 Canvas. Приведенный ниже код берет файл РФА-в-A-PDF и превращает его в C# объекта с помощью itextsharp:

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()); 
    }