2010-02-24 3 views
0

ASP.NET 응용 프로그램에서 iTextSharp (주로 PdfStamper)를 사용하여 PDF의 일부 내용을 채우고 사용자에게 보냅니다. 다음 코드는 OnClick 이벤트 내부 :Response.Stream 출력 (PDF)이 Adobe Reader에서 손실되었습니다.

PdfReader r = new PdfReader(
    new RandomAccessFileOrArray(Request.MapPath(compatiblePdf)), null 
); 

ps = new PdfStamper(r, Response.OutputStream); 
AcroFields af = ps.AcroFields; 

af.SetField("ContactInfo[0]", o.mallName); 
af.SetField("ClientName", string.Format("{0} {1}", c.firstName, c.lastName)); 
af.SetField("ClientEmail", c.emailAddress); 
ps.FormFlattening = true; 
Response.ContentType = "application/pdf"; 
Response.AddHeader("Content-Disposition", "attachment; filename=Form.pdf"); 
ps.Close(); 
Response.End(); 

그래서, 기본적으로, PdfReader이 파일을 가져와, PdfStamper는 인수로 PdfReader 소요되며, Response.OutputStream에 완성 된 PDF를 밀어 것입니다.

문제는 IE와 Adobe Reader에서 파일 대화 상자에서 "열기"를 선택하면 Adobe Reader에서 "파일을 찾을 수 없습니다"라는 오류가 발생합니다. 사용자는 파일을 "저장"할 수 있으며 다운로드를 다시 시작할 수도 있습니다 (질문에 다시 "열기"를 클릭). 그러나 파일을 다운로드 한 적이없는 새로운 컴퓨터에서 Adobe Reader는 파일을 임시 파일이나 다른 IE로 이동하는 사이에 파일을 잘못 배치 한 것처럼 보입니다.

나는 지금 당장 한 가지만 상상할 수 있습니다 : Response.End(),해야할까요, 어쩌면 Response.Close()이되어야합니다. 아니면 그 전에 Response.Flush()이 있어야합니다. 하지만 그게 문제를 악화시키지 않는다는 것을 확실히 모르겠다. 나는 파일을 한 번 다운로드하면 오류가 다시 발생하지 않기 때문에 테스트하는 데 어려움을 겪고있다.

문제가 해결 되었습니까? 헤더에 문제가 있습니까? 아니면 Response/PdfStamper 객체로해야 할 일이 있습니까?

Response.Clear() 
Response.ClearHeaders() 
Response.Buffer = True 
Response.ContentType = "your mime type" 
Response.CacheControl = "public" 
Response.AddHeader("Pragma", "public") 
Response.AddHeader("Expires", "0") 
Response.AddHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0") 
Response.AddHeader("Content-Description", "Description of your content") 
Response.AddHeader("Content-Disposition", "attachment; filename=""somefile.pdf""") 

' Add your content to the buffer here 

Response.Flush() 
Response.End() 

이 모든 "파일을 찾을 수 없습니다"쓰레기를 방지 꽤 좋은 것 같습니다 : 나는 사용자에 내용을 강제 할 때마다

답변

5

, 나는 응답을위한 단계 세트를 수행합니다.

편집 :이 헤더는 실제로 무엇을 의미하는지에 관심있는 사람들을 위해는 :

  1. Pragma: public는 HTTP/1.0 요청과 이전 버전과의 호환성을위한 제어 캐시를하는 데 도움이됩니다. 이미 캐시 된 응답이 있어도 요청이 서버로 전달되도록합니다.
  2. Expires: 0은 응답이 만료되는 간격 (초)입니다. 0으로 설정하면 응답이 즉시 만료되므로 부실 캐시를 피할 수 있습니다.
  3. Cache-control: must-revalidate은 모든 명령을 준수해야한다는 것을 캐시에 알립니다. 즉, 요청할 때 새로운 응답을 제공해야합니다.
  4. Cache-control: post-check=0, pre-check=0 : 응답이 콘텐츠를 제공하기 전/전에 (각각 제공되는) 신선도를 확인해야하는 간격 (초)입니다. 0으로 설정하면 응답의 신선도가 즉시 검사됩니다. (More at MSDN)
  5. 나머지는 단순히 사용자가 받기를 원하는 콘텐츠를 설명하는 것입니다. "첨부 파일"을 지정하면 브라우저가 파일을 다운로드로 제공하고 인라인으로 표시하지 않도록 지시합니다.
+0

이 작업을 수행해야하는 이유는 무엇입니까? 그것은 작동하지만 특별한 이유가 있습니까? – tHeSiD

+0

나는 내가 기억하거나 파고들 수있는 게시물을 업데이트했다. –