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()
이 모든 "파일을 찾을 수 없습니다"쓰레기를 방지 꽤 좋은 것 같습니다 : 나는 사용자에 내용을 강제 할 때마다
이 작업을 수행해야하는 이유는 무엇입니까? 그것은 작동하지만 특별한 이유가 있습니까? – tHeSiD
나는 내가 기억하거나 파고들 수있는 게시물을 업데이트했다. –