iTextSharp - как открыть / прочитать / извлечь файл вложения? - PullRequest
1 голос
/ 09 июня 2010

У меня есть несколько PDF-файлов с двумя вложенными файлами со статическими именами.Я хотел бы использовать iTextSharp для извлечения этих файлов во временный каталог, чтобы я мог работать с ними дальше.Я попытался следовать руководству здесь , но столкнулся с проблемами, когда iTextSharp.text.pdf.PdfReader не имел getCatalog() метода, как показано в нижнем примере.извлечь вложения?Для простоты скажем, что документ PDF находится по адресу «C: \ test.pdf», а два вложения хранятся как «attach1.xml» и «attach2.xml».

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

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

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 голосов
/ 10 июня 2010

В итоге я нашел способ сделать это - хотя не совсем программно.Я включил двоичный файл с именем "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 в проект, вам необходимо установить его свойства «Копировать всегда» или «Копировать, если новее».

...