2 Stimmen

iTextSharp - wie öffnet/liest/extrahiert man einen Dateianhang?

Ich habe einige PDFs mit zwei angehängten Dateien mit statischen Namen. Ich möchte iTextSharp verwenden, um diese Dateien in ein temporäres Verzeichnis zu extrahieren, so dass ich mit ihnen weiter arbeiten kann. Ich habe versucht, nach dem Tutorial aquí aber ich bin auf Probleme gestoßen, als die iTextSharp.text.pdf.PdfReader hatte keine getCatalog() Methode, wie im unteren Beispiel gezeigt.

Gibt es einen Tipp, wie ich die Anhänge extrahieren kann? Sagen wir der Einfachheit halber, dass sich das PDF-Dokument unter " C:\test.pdf "und die beiden Anhänge werden als "attach1.xml" und "attach2.xml" gespeichert.

3voto

m4r10 Punkte 31

Ich habe diese Lösung gefunden. Ich weiß nicht, ob es der beste Weg ist, aber es funktioniert!!!

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

0voto

Adam S Punkte 8665

Ich habe schließlich einen Weg gefunden, dies zu tun - wenn auch nicht gerade programmatisch. Ich habe eine Binärdatei namens "pdftk.exe" (PDF ToolKit) eingebunden, die über Befehlszeilenoptionen zum Extrahieren der Anhänge verfügt.

Um das klarzustellen, habe ich pdftk.exe hinzugefügt und es dann über Process.Start("./pdftk", "contains_attachments.pdf unpack_files output \"C:\\output_directory\"") . Beachten Sie, dass pdftk nicht in einen Ordner mit einem nachgestellten Backslash ausgibt. Sie können pdftk hier finden: http://www.accesspdf.com/pdftk/

Nachdem Sie die .exe-Datei zum Projekt hinzugefügt haben, müssen Sie ihre Eigenschaften auf "Immer kopieren" oder "Kopieren, wenn neuer" einstellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X