2014-03-31 3 views
0

JSPDF을 사용하여 IE 8 이상의 모든 브라우저에서 오프라인으로 호환되는 응용 프로그램의 클라이언트 측에서 PDF 파일을 생성합니다. JSPDF는 IE8 (IE8은 HTTP GET의 크기를 제한합니다)에서 작동하므로 해결책은 서버에서 파일을 저장하고 호스팅되는 클라이언트에 대한 링크를 반환하는 API 작업에 대한 게시물을 수행하는 것이 었습니다 IE8 지원은 오프라인 기능이 필요하지 않습니다.서버에서 이미지를 생성 할 때 이미지가 손상됩니다. 클라이언트가 생성 할 때 발생하지 않습니다

JSPDF가 출력 한 raw 바이트를 서버에 게시 할 때 PDF에 이미지가없는 한 PDF를 저장할 수 있습니다. 이미지가 있으면 데이터가 손상되어 파일을 열려고 할 때 메모리 오버플로가 발생합니다.

왜 이미지가 암호화되지 않습니까? 필자의 초기 추측은 raw 바이트에 잘못된 문자가 포함되어 있었지만 PDF 파일 소스를 빠르게 확인하면 그럴 수 없다는 것을 나타냅니다.

컨트롤러 액션 :

public struct PdfBytesContainer 
{ 
    public byte[] RawPdfBytes { get; set; } 
} 

[HttpPost] 
public string Post(PdfBytesContainer container) 
{ 
    var fileName = "test"; 
    File.WriteAllBytes(@"PathToFile\File.pdf", container.RawPdfBytes); 
    return fileName; 
} 

AJAX POST :

var pdfData = { 
    rawPdfBytes: doc.output()//.substring(0, 100) 
}; 
$.ajax({ 
    url: pdfApiUrl, 
    type: "POST", 
    data: pdfData, 
    success: function(response) { 
     var url = "/Content/Pdfs/" + response + ".pdf"; 
      window.open(url,'_blank'); 
    }, 
    failure: function(response) { 
     alert("failed " + response); 
    } 
}); 

참고 : I 또한 PdfBytesContainer 구조체의 byte [] 대신 문자열을 사용하여 시도 하였다. 같은 오류가 발생합니다.

답변

0

원시 바이트가 아닌 Blob [1] 또는 ArrayBuffer [2]를 보내보십시오.

[1] : doc.output ("blob");

[2] : doc.output ("arraybuffer"); // 최신 jsPDF 버전을

즉이 필요합니다

var fd = new FormData(); 
fd.append("csrf", someToken); 
fd.append("blob", doc.output("blob")); 
$.ajax({ 
    url: pdfApiUrl, 
    type: "POST", 
    data: fd, 
    processData: false, 
    contentType: "multipart/form-data", 
    ... 
}); 

은 분명히 당신도, 서버 측 코드를 적용해야합니다.

관련 문제