2010-05-13 6 views
0

단일 TIFF 파일을 표시하는 데 JSP를 사용하고 있습니다. 흐름은 다음과 같습니다.JSP의 출력 스트림에서 tiff 파일을 반환하십시오.

  1. TIFF로 변환하려면 PDF가 제공됩니다.
  2. File 객체와 OutputStream 형식의 PDF로 '블랙 박스'API를 제공합니다 (현재 ByteArrayOutputStream을 사용하고 있지만 필요에 따라 변경할 수 있습니다.)
  3. '블랙 박스'는 PDF를 TIFF와는 OutputStream에 결과를 저장합니다.
  4. 나는 TIFF를 뱉어 (의 OutputStream를) out.println 사용합니다.

문제는 내가 표시된 이미지 대신 텍스트 스트림을 얻고 있다는 점이다. 내가 가진 다음 머리/메타 태그를 사용했습니다.

<head><title>PDF to TIFF tester</title> 
    <META HTTP-EQUIV="Content-Script-Type" CONTENT="image/tiff"></head> 
    <body> 

하지만 최종 결과는 변경되지 않습니다. 어떤 도움이 필요합니까?

답변

0

실용주의. image/tiff에 대한 http 응답의 콘텐츠 유형이 필요합니다.

포어 대한 추가 정보 : http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Response-Headers.html

+0

이것은 내가 다루는 것과 완전히 다른 설정입니다. JSP와 서블릿은 완전히 다른 두 가지입니다. JSP에서 인라인 코드와 함께 응답 객체를 사용할 수 없습니다. 응답 유형을 설정하는 또 다른 방법이 있습니까? 누군가 – YYY

+0

처럼 서블릿을 사용합니다. – Midhat

0

메타 태그는 브라우저에 보이는 것이 아니다. 스크립틀릿을 사용하여 응답 개체에 대한 콘텐츠 형식을 설정하십시오. 이 page에는 몇 가지 제안 사항이 있습니다.

2

이 경우 JSP를 사용하면 안됩니다. HTML/CSS/JS 코드를 넣을 텍스트 기반 템플릿과 taglibs (JSTL 등) 및 EL (Expression Language, ${} 가지)의 도움으로 백엔드 Java 코드와 상호 작용하는 기능을 제공하는 뷰 기술입니다.

TIFF 이미지는 문자 (텍스트) 데이터가 아닙니다. 이진 데이터입니다. 이것을 위해 서블릿을 사용해야합니다. 이진 데이터를 반환하려면 Writer 메서드를 사용하지 않아야합니다. 이를 위해서는 OutputStream 방법을 사용해야합니다. 그렇지 않으면 바이너리 데이터가 손상됩니다 (JSP에서 후드가 Writer을 사용하기 때문에 발생합니다). 여기

은 서블릿과 같아야 어떻게 킥오프 예제 : 예를 /pdf2tiff에 대한의 url-pattern

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String pdfFilename = request.getParameter("filename"); 
    File pdfFile = new File("/path/to/all/pdf/files", pdfFilename); 

    response.setHeader("Content-Type", "image/tiff"); 
    doYourThingToConvertPdfFileToTiff(pdfFile, response.getOutputStream()); 
} 

지도이 서블릿을 그래서 당신은 링크 나 브라우저의 주소 표시 줄 또는에서 srchttp://example.com/contextname/pdf2tiff?filename=file.pdf하여 호출 할 수 있음 속성은 <img>입니다.

doYourThingToConvertPdfFileToTiff은 이미 OutputStream에 TIFF를 쓰는 것처럼 보이는 "블랙 박스"API입니다. 그냥 사용하고 HTTP 응답 중 하나를 통해 전달하십시오.


업데이트 : 당신이 정말, 정말 이것에 대한 JSP를 사용해야 할 경우 서블릿 클래스에서하는 것처럼, 당신은 단지 JSP에서 동일한 코드를 작성할 수 있습니다. 실제로 copypaste 할 수 있습니다. 이 아니고이 스트림에 대한 모든 템플릿 텍스트를 작성했는지 확인하십시오. 여기에는 스크립틀릿 외부에 줄 바꿈과 공백이 포함됩니다. 그렇지 않으면 바이너리 파일에 기록되어 손상 될 수 있습니다.

여러 개의 스크립틀릿 블록이있는 경우 끝에 스크립팅 릿 %>과 다음 스크립틀 릿의 <% 사이에 줄 바꿈이 없도록 정렬해야합니다. 따라서, 예를 들어.

당신은 임의로 생성 된 이름의 파일로 출력 스트림을 저장할 수 있습니다, 다음 파일을 참조 : 대신 당신이 는 JSP를 사용해야하는 경우

<%@page import="java.io.File" %> 
<% 
    //... 
%> 
+0

저는 이것을 위해 서블릿을 사용하고 싶지만, 제 동료들은 그렇게해서는 안된다는 것을 강력히 주장했습니다. JSP 사용 결정은 내 자신이 아니 었습니다. 덧붙여서 JSP의 첫 번째 줄에서 인코딩을 처리하는 방법을 발견했습니다. 그러나, 프로젝트가 지원되지 않는다고 불평하는 원인이됩니다. 이는 내가 원했던 것입니다. (예를 들어, "% tp" 전체 시간을 보는 것을 조금 두려워합니다. 나는이 결과를 동료들에게 가져가는 동안이 질문이 끝날지 모른다고 생각한다. – YYY

+0

답변이 업데이트되었습니다. 나는 당신이 실제로'OutputStream'으로 무엇을해야하는지에 대한 통찰력을 얻길 바랍니다. 나중에'InputStream'으로 다시 마사지하는 ByteArrayOutputStream을 넘겨서 응답의'OutputStream'에 쓰지 마십시오. 그것은 단지 비효율적입니다. 또한 실제로'OutputStream' 인스턴스를'print()'할 수 없기 때문에 응답에서'Object # toString()'의 결과 만 볼 수 있습니다. – BalusC

+0

이 작업을 수행하는 가장 좋은 방법은 블랙 박스에서 지원하는 경우 래스터 화 된대로 PDF를 클라이언트로 스트리밍 할 수 있습니다. 이렇게하면 메모리를 절약 할 수 있습니다. 블랙 박스가 실시간으로 래스터 화를하는지 확인하십시오. 특히 동시 요청 수가 많으면 특히 그렇습니다. – Justin

0

<%@page import="java.io.File" %><% 
    //... 
%> 

JSP에서. 출력 디렉토리가 웹 서버 경로에 있는지 확인해야합니다.

이것은 또한 자신의 문제와 함께 제공 :

  • 당신은 (그래서 서버의 디스크가 채울 것) 오래된 파일을 삭제하는 방법으로 파일 시스템을 관리해야합니다.
  • 파일 동기화를 관리해야합니다 (두 서버 스레드가 동일한 파일을 업데이트하지 않아야 함).
  • 아, 한 사용자가 생성 한 이미지를 다른 사용자가 볼 수 없도록해야합니다.

많은 사람들이 이런 종류의 일을하는 것을 보았습니다. 저는 도서관이 있다고 확신합니다.

관련 문제