Поврежденный файл PDF - PullRequest
       18

Поврежденный файл PDF

1 голос
/ 17 августа 2011

Я пытаюсь сделать следующее:

  1. Получить сгенерированный PDF-файл с веб-страницы
  2. Создать сообщение электронной почты
  3. Прикрепить PDF к сообщению
  4. Отправьте сообщение

Я могу получить pdf с веб-страницы и отправить сообщение с приложением. Однако, когда я пытаюсь открыть вложение, я получаю страшное сообщение «Adobe Reader не может открыть файл« filename.pdf », потому что это либо не поддерживаемый тип файла, либо файл поврежден».

PDF создается страницей MVC3 с использованием пользовательского ActionResult для возврата PDF. Похоже, это

public class EnrollmentExpectationsPdfResult : FileResult
{
    IList<AdminRepEnrollmentExpectationViewModel> adminreps;

    public EnrollmentExpectationsPdfResult(IList<AdminRepEnrollmentExpectationViewModel> adminrep)
        : this("application/pdf", adminrep)
    { }

    public EnrollmentExpectationsPdfResult(string contentType, IList<AdminRepEnrollmentExpectationViewModel> adminrep)
        : base(contentType)
    {
        adminreps = adminrep;

    }

    protected override void WriteFile(HttpResponseBase response)
    {
        var cd = new ContentDisposition
        {
            Inline = true,
            FileName = "MyPDF.pdf"
        };
        response.AppendHeader("Content-Disposition", cd.ToString());

        //Skip a bunch of boring font stuff
        ...

        var writer = PdfWriter.GetInstance(doc, response.OutputStream);
        writer.PageEvent = new EnrollmentExpectationPDFPageEvent();            
        doc.Open();

        //Skip the doc writing stuff
        ...

        doc.Close();
    }
}

Здесь указан метод контроллера

public ActionResult EnrollmentExpectationsPDF()
{
    //skip a bunch a database stuff
    ...
    return new EnrollmentExpectationsPdfResult(adminList);
}

Вот код в основе проблемы ...

//Get PDF
CredentialCache cc = new CredentialCache();
cc.Add(
       new Uri("http://myserver/mypdfgeneratingpage"),
       "NTLM",
       new NetworkCredential("myusername", "mypassword"));

var webRequestObject = (HttpWebRequest)WebRequest.Create("http://iapps.national.edu/erp/Reports/EnrollmentExpectationsPDF");
webRequestObject.Credentials = cc;
var response = webRequestObject.GetResponse();
var webStream = response.GetResponseStream();

//Create Mail
System.Net.Mail.MailMessage eMail = ...

//Skipping to attachment stuff
ContentType ct = new ContentType()
{
     MediaType = MediaTypeNames.Application.Pdf,
     Name = "EnrollmentExpecations_2.pdf"
};

Attachment a = new Attachment(webStream, ct);
eMail.Attachments.Add(a);

//Send Message
....

В качестве эксперимента я попытался записать загруженный файл на диск

MemoryStream ms = new MemoryStream();
var fileStream = File.Create("C:\\MyPDF.pdf");
webStream.CopyTo(fileStream);

Альт, я могу открыть файл с диска без проблем.

Чего мне не хватает, чтобы сделать приложение читабельным?

Ответы [ 2 ]

2 голосов
/ 17 декабря 2013

Для нас ответ был другим.

Проблема заключалась в том, что при записи в базу данных мы использовали GetBuffer () вместо ToArray ().Таким образом, если буфер был 256, то оставшаяся сумма была добавлена ​​к документу в базе данных как нулевые символы.

Я нашел ответ здесь http://forums.asp.net/t/1083910.aspx

Я недумаю, ошибка в вашем коде для загрузки документа.Я считаю, что ошибка происходит из-за того, как документ изначально хранится в базе данных.Убедитесь, что вы не используете метод GetBuffer () при записи файла в базу данных.Попробуйте вместо этого использовать ToArray (), и он не будет добавлять дополнительные символы в конец вашего файлового потока.Вот ссылка, чтобы дать вам более подробную информацию: http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx

Дополнительные символы после тега %% EOF в конце вашего документа PDF, скорее всего, вызывают сообщение:

2 голосов
/ 05 апреля 2012

Просто, чтобы дать понять пользователям, благодаря @ rlb.usa

" Убедитесь, что вы закрыли и очистили свой поток после отправки объекта "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...