您不应该为此使用 JSP。它是一种视图技术,提供基于文本的模板以将 HTML/CSS/JS 代码放入其中,并借助标记库(JSTL 等)和 EL(表达式语言,${} 事物)与后端 Java 代码交互。
TIFF 图像不是字符(文本)数据。这是一个二进制数据。您确实需要为此使用 servlet。您不应该使用Writer 方法返回二进制数据。您应该为此使用OutputStream 方法。否则二进制数据会被破坏(这也是 JSP 中发生的事情,因为它在后台使用 Writer)。
这是一个启动示例,您的 servlet 应该是这样的:
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());
}
将此 servlet 映射到 url-pattern 或例如 /pdf2tiff,以便您可以通过链接或浏览器地址栏中的 http://example.com/contextname/pdf2tiff?filename=file.pdf 甚至在 <img> 元素的 src 属性中调用它。
doYourThingToConvertPdfFileToTiff 是您的“黑匣子”API,它似乎已经将 TIFF 写入给定的OutputStream。只需利用它并传递 HTTP 响应之一即可。
更新:如果您真的非常需要为此使用 JSP,您可以在 JSP 中编写与在 Servlet 类中相同的代码。您实际上可以复制粘贴它。只需确保您不将任何模板文本写入流,这包括小脚本之外的换行符和空格。否则它也会被写入二进制文件并损坏它。
如果您有多个 scriptlet 块,则需要对它们进行排列,以便在一个 scriptlet 的结尾 %> 和下一个 scriptlet 的开头 <% 之间没有换行符。因此,例如
<%@page import="java.io.File" %><%
//...
%>
而不是
<%@page import="java.io.File" %>
<%
//...
%>