2013-01-07 2 views
3

브라우저에 PDF 파일을 표시하고 싶습니다. JS에서 pdf에 대한 경로가 있으며 Java에서 서블릿으로 PDF를 가져 오기 위해 호출하고 있습니다. 여기에 지금까지이 작업은 다음과 같습니다서블릿과 함께 브라우저에 PDF 표시

자바 스크립트 :

RequestManager.getJSON(Config.server + "getPDF.json?pdfPath=" + this.pathToPdfFile, (function(data){ 
     $("#" + this.divId).append('<object id="' + this.pdfObjectId + '" data="' + data + '" type="application/pdf" width="600" height="800"></object>'); 
     ResizeManager.addResizeHandler(this.pdfObjectId, this.divId, -10, -10); 
    }).bind(this)); 

자바 :

@RequestMapping("/getPDF") 
public void pdfPathToServlet(Model model, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
    String pdfPath = request.getParameter("pdfPath"); 
    if (pdfPath == null || pdfPath.equals("")) 
     throw new ServletException("Invalid or non-existent file parameter in UrlServlet servlet."); 

    if (pdfPath.indexOf(".pdf") == -1) 
     pdfPath += ".pdf"; 

    File pdf = new File(pdfPath); 
    String pdfName = pdfPath.substring(pdfPath.lastIndexOf("/") + 1, pdfPath.length()); 
    logger.debug(pdfName); 
    ServletOutputStream stream = null; 
    BufferedInputStream buf = null; 
    try 
    { 
     stream = response.getOutputStream(); 
     response.setContentType("application/pdf"); 
     response.setHeader("Content-Disposition", "inline; filename='" + pdfName + "'"); 
     FileInputStream input = new FileInputStream(pdf); 
     response.setContentLength((int) pdf.length()); 
     buf = new BufferedInputStream(input); 
     int readBytes = 0; 
     while ((readBytes = buf.read()) != -1) 
      stream.write(readBytes); 
    } 
    catch (IOException ioe) 
    { 
     throw new ServletException(ioe.getMessage()); 
    } 
    finally 
    { 
     if (stream != null) 
      stream.close(); 
     if (buf != null) 
      buf.close(); 
    } 
} 

내 문제는이 텍스트로 내 브라우저에서 바이너리 출력을 보여주는 것입니다.

내가 잘못하고 있는지 확실하지 않습니다. 인라인 대신 첨부 파일로 헤더를 변경하려고 시도했지만 동일한 결과가 나타났습니다. 나는 브라우저에서 보여주고 다운로드하지 않으려 고하면서 인라인을 원한다고 생각한다.

+0

'application/pdf '를 반환하면 왜 URL이'.json'으로 끝나는 것입니까? –

+0

@ Michael-O 솔직히 말해서, 나는 그것을 버릇없이 버렸습니다. 애플리케이션 작성 방법은 전체 애플리케이션이 실행되는 하나의 URL입니다. 그것은 실제로 변하지 않습니다. .json은 실제로 페이지가 실제로 보유하지 않는 다른 URL로 실제로 리디렉션되지 않도록하기 위해 보통 사용됩니다. – user856354

+1

그것은 서블릿이 아닙니다. 그것은 스프링 MVC 컨트롤러 동작입니다. – BalusC

답변

5

자바 스크립트 부분은 의미가 없습니다. 아약스 응답으로 PDF 파일을 얻은 다음 요소의 data 속성으로 설정하려고합니다. data 속성은 파일 내용이 아닌 실제 URL을 지정해야합니다. 그에 따라 JS 수정 :

$("#" + this.divId).append('<object id="' + this.pdfObjectId + '" data="' + Config.server + "getPDF.json?pdfPath=" + this.pathToPdfFile + '" type="application/pdf" width="600" height="800"></object>'); 

가능한 경우 Adobe Acrobat Reader가 플러그인 —를 사용하여 <object> 요소를 렌더링/지정된 URL에 해당하는 HTTP 요청을 전송 및 초기화에 대한 돌볼 것이다 웹 브라우저, 차라리 둘러싸 것 <a href="pdfURL">PDF</a><object> 안에 넣으면 다운로드 링크에 적어도 정상적인 성능 저하가 발생합니다.


자바 코드는 모든 서블릿의 일부가 아닌 것을 구체적인 질문에 관련없는,하지만 스프링 MVC 액션. 귀하의 조건을 곧바로 받아 들여서 그들이 실제로 무엇인지 배우기 위해 our Servlets wiki page을 읽어 볼 것을 권합니다.

+0

고맙습니다. – user856354

+0

반갑습니다. – BalusC

+1

또한 가난한 용어에 대해 사과드립니다. 나는 일반적으로 사물의 측면에서 일하지 않습니다. 최근의 고용 변화로 인해 일시적으로이 문제에 빠졌고 매우 마감 기한을 맞추기 위해 노력하고 있습니다.벽쪽으로 최대 속도로 달릴 때 물건을 집으려고합니다. – user856354

-1
response.setHeader("Content-Disposition", "inline; filename='" + pdfName + "'"); 

PDF 인라인을 표시 할 수 없습니다. 자체 페이지 (또는 Iframe)에 혼자 있어야합니다.

+3

사실이 아닙니다. 인라인 헤더 값이있는 브라우저에서 초기 URL을 찾을 수 없으면 브라우저에서 PDF 플러그인이 열립니다. 그렇지 않으면 새 PDF 뷰어 창이 열립니다. –

+0

AJAX 통화에서 왔습니까? 난 그렇게까지 확신은 못해. –

+0

'첨부 파일'조차 전혀 작동하지 않았을 것입니다. JS는 확실한 보안상의 이유 때문에 어떤 변수에 임의의 내용을 저장하는 * Save As * 대화 상자를 강제로 사용할 수있는 기능이 없습니다. 전체 답변은 적용되지 않습니다. 브라우저가 적절한 플러그인 (Adobe Reader)을 가지고 있다면'inline'은 동기식 요청에서 확실히 작동합니다. – BalusC

0
response.setHeader("Content-Disposition", "attachment;filename=" + pdfName); 
관련 문제