2010-06-09 3 views
1

У меня есть несколько файлов PDF с двумя прикрепленными файлами со статическими именами. Я хотел бы использовать iTextSharp для извлечения этих файлов в каталог temp, чтобы я мог работать с ними дальше. Я пробовал следовать учебнику here, но я столкнулся с проблемами, когда iTextSharp.text.pdf.PdfReader не имел метода getCatalog(), как показано в нижнем примере.iTextSharp - как открыть/прочитать/извлечь прикрепленный файл?

Любые советы о том, как я могу извлечь вложения? Давайте просто скажем, что документ PDF находится в «C: \ test.pdf», а два вложения хранятся как «attach1.xml» и «attach2.xml».

ответ

0

В итоге я нашел способ сделать это - хотя и не совсем программно. Я включил двоичный файл под названием «pdftk.exe», который представляет собой PDF ToolKit, который имеет параметры командной строки для извлечения вложений.

Чтобы уточнить, я добавил pdftk.exe, а затем вызвал его через Process.Start("./pdftk", "contains_attachments.pdf unpack_files output \"C:\\output_directory\""). Обратите внимание, что pdftk не будет выводиться в папку с обратной обратной косой чертой. Вы можете найти pdftk здесь: http://www.accesspdf.com/pdftk/

После добавления файла .exe в проект вам необходимо установить его свойства «Копировать всегда» или «Копировать, если новый».

0

Я нашел это решение. Я не знаю, если это лучший способ, но он работает!

protected void btnTransfer_Click(object sender, EventArgs e) 
{ 
    PdfReader reader = new PdfReader(FileUpload1.FileContent); 
    List<FileContent> lstAtt = GetAttachments(reader); 
    reader.Close(); 
} 

private class FileContent 
{ 
    public string Name { get; set; } 

    public byte[] Content { get; set; } 
} 

private List<FileContent> GetAttachments(PdfReader reader) 
{ 
    #region Variables 

    PdfDictionary catalog = null; 
    PdfDictionary documentNames = null; 
    PdfDictionary embeddedFiles = null; 
    PdfDictionary fileArray = null; 
    PdfDictionary file = null; 

    PRStream stream = null; 

    FileContent fContent = null; 
    List<FileContent> lstAtt = null; 

    #endregion 

    // Obtengo el conjunto de Diccionarios del PDF. 
    catalog = reader.Catalog; 

    // Variable que contiene la lista de archivos adjuntos. 
    lstAtt = new List<FileContent>(); 

    // Obtengo documento 
    documentNames = (PdfDictionary)PdfReader.GetPdfObject(catalog.Get(PdfName.NAMES)); 

    if (documentNames != null) 
    { 
     // Obtengo diccionario de objetos embebidos 
     embeddedFiles = (PdfDictionary)PdfReader.GetPdfObject(documentNames.Get(PdfName.EMBEDDEDFILES)); 
     if (embeddedFiles != null) 
     { 
      // Obtengo lista de documentos del Diccionario de objetos embebidos 
      PdfArray filespecs = embeddedFiles.GetAsArray(PdfName.NAMES); 

      // Cada archivo posee 2 posiciones en el array 
      for (int i = 0; i < filespecs.Size; i++) 
      { 
       // Como posee 2 posiciones por archivo, hago "i++" 
       i++; 
       fileArray = filespecs.GetAsDict(i); 

       // Obtengo diccionario del adjunto 
       file = fileArray.GetAsDict(PdfName.EF); 

       foreach (PdfName key in file.Keys) 
       { 
        stream = (PRStream)PdfReader.GetPdfObject(file.GetAsIndirectObject(key)); 

        fContent = new FileContent(); 
        // Nombre del Archivo. 
        fContent.Name = fileArray.GetAsString(key).ToString(); 

        // Array de bytes del Contenido del Archivo. 
        fContent.Content = PdfReader.GetStreamBytes(stream); 
        lstAtt.Add(fContent); 
       } 
      } 
     } 
    } 

    // Y al fin, devuelvo una lista de adjuntos del PDF - podrían haberlo echo un poco mas facil :@ 
    return lstAtt; 
} 
+0

Можете ли вы поместить код в javascript для того же функционала? –

Смежные вопросы