2010-06-09 5 views
1

J'ai quelques PDF tous avec deux fichiers joints avec des noms statiques. Je voudrais utiliser iTextSharp pour extraire ces fichiers dans un répertoire temporaire afin que je puisse travailler avec eux plus loin. J'ai essayé de suivre le tutoriel here mais j'ai rencontré des problèmes lorsque le iTextSharp.text.pdf.PdfReader n'avait pas de méthode getCatalog() comme indiqué dans l'exemple du bas.iTextSharp - comment ouvrir/lire/extraire une pièce jointe?

Un conseil sur la façon dont je peux extraire les pièces jointes? Disons simplement que le document PDF est à "C: \ test.pdf" et que les deux pièces jointes sont stockées sous "attach1.xml" et "attach2.xml".

Répondre

0

J'ai fini par trouver un moyen de le faire - mais pas exactement par programmation. J'ai inclus un binaire appelé "pdftk.exe" qui est PDF ToolKit, qui a des options de ligne de commande pour extraire les pièces jointes. Pour clarifier, j'ai ajouté pdftk.exe, puis appelé par Process.Start("./pdftk", "contains_attachments.pdf unpack_files output \"C:\\output_directory\""). Notez que pdftk ne sera pas affiché dans un dossier avec une barre oblique inverse. Vous pouvez trouver pdftk ici: http://www.accesspdf.com/pdftk/

Après avoir ajouté le fichier .exe au projet, vous devez définir ses propriétés sur "Toujours copier" ou "Copier si plus récent".

0

J'ai trouvé cette solution. Je ne sais pas si c'est la meilleure façon, mais ça marche !!

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

Pouvez-vous mettre un code en javascript pour la même fonctionnalité? –