itextsharp читать защищенный паролем файл в поток

У нас есть PDF-файл, который мы заполняем из веб-формы через iTextSharp 5.5. Мы сохраняем этот PDF-файл в сетевом ресурсе из-за среды веб-фермы. Позже в приложении нам нужно представить заполненный pdf пользователю для чтения только для подтверждения документа перед продолжением.

PDF-файл защищен паролем, для просмотра мы обходим это с помощью:

PdfReader.unethicalreading = true;

Все это работает при разработке на одном веб-сервере или локальном хосте, если сохранить PDF-файл в папку на веб-сервере и, таким образом, прочитать с этого локального сервера.
Однако при развертывании на веб-ферме нам нужно прочитать PDF-файл. обратно из общего сетевого ресурса, таким образом, получая файл и считывая его в поток. Однако, используя эту технику, мы всегда получаем «Введите пароль, чтобы открыть PDF».

PDF отображается в iFrame со следующим:

// DOES WORK (but only on single server or localhost)
// pdfAgreement.Attributes["src"] = "PdfFolder/myfile.pdf";

// does not work
pdfAgreement.Attributes["src"] = "../ShowFile.aspx?file=myfile.pdf";

Код в ShowFile.aspx:

 string path = "networkshare" + "myfile.pdf"; // Request.QueryString["file"];
 FileInfo file = new FileInfo(path);

 if (file.Exists)
 {
   PdfReader reader = new PdfReader(path);
   PdfReader.unethicalreading = true;
   MemoryStream ms = new MemoryStream();    
   PdfStamper pdfStamper = new PdfStamper(reader, ms);
   pdfStamper.Writer.CloseStream = false;
   pdfStamper.Close();
   pdfBytes = ms.ToArray();
   reader.Close();

   Response.ContentType = "application/pdf";
   Response.AddHeader("content-length", pdfBytes.Length.ToString());
   Response.AddHeader("Content-Disposition", "inline;filename=data.pdf");
   Response.BinaryWrite(pdfBytes);
}

Есть ли способ прочитать защищенный паролем файл из потока памяти? По какой-то причине это работает на одном веб-сервере или локальном хосте, но не в том случае, если нам нужно прочитать файл из общей папки.


person Ben Ziegler    schedule 25.02.2016    source источник


Ответы (1)


Итак, я обнаружил, что этот код прекрасно работает, когда ваша страница наследуется от System.Web.UI.Page.

Страница, которую я использовал, наследовалась от BasePage, которая творит с ответом какую-то другую магию, которая искажала ответ страницы .aspx.

person Ben Ziegler    schedule 25.02.2016