0

我正在使用 JSP 来显示单个 TIFF 文件。流程如下:

  1. 我得到了一个 PDF 来转换为 TIFF。
  2. 我以 File 对象和 OutputStream 的形式向“黑盒”API 提供 PDF(我目前正在使用 ByteArrayOutputStream,但可以根据需要进行更改。
  3. “黑匣子”将 PDF 转换为 TIFF 并将结果保存到 OutputStream。
  4. 我使用 out.println(outputstream) 吐出 TIFF。

问题是我得到的是文本流而不是显示的图像。我使用了以下头部/元标记:

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

但这并不会改变最终结果。有什么帮助吗?

4

4 回答 4

2

您不应该为此使用 JSP。它是一种视图技术,提供了一个基于文本的模板来放入 HTML/CSS/JS 代码,以及借助 taglibs(JSTL 等)和 EL(表达语言,${}事物)与后端 Java 代码交互的设施。

TIFF 图像不是字符(文本)数据。这是一个二进制数据。您确实需要为此使用 servlet。您不应该使用Writer方法返回二进制数据。您应该OutputStream为此使用方法。否则二进制数据将被损坏(这也是 JSP 中发生的情况,因为它在后台使用 a 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());
}

url-pattern例如,将此 servlet 映射到一个,以便您可以通过在链接或浏览器地址栏中甚至在元素的属性中/pdf2tiff调用它。http://example.com/contextname/pdf2tiff?filename=file.pdfsrc<img>

doYourThingToConvertPdfFileToTiff是您的“黑匣子”API,它似乎已经将 TIFF 写入给定的OutputStream. 只需使用它并传递 HTTP 响应之一。


更新:如果您真的非常需要为此使用 JSP,您可以在 JSP 中编写与在 Servlet 类中相同的代码。您实际上可以复制粘贴它。只需确保您没有将任何模板文本写入流,这包括小脚本之外的换行符和空格。否则它也会被写入二进制文件并损坏它。

如果您有多个 scriptlet 块,则需要对它们进行排列,以便在 scriptlet 的结尾%>和下一个 scriptlet 的开始之间没有换行符<%。因此,例如

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

代替

<%@page import="java.io.File" %>
<%
    //...
%>
于 2010-05-13T18:17:13.120 回答
0

这行不通。您需要对 image/tiff 的 http 响应的内容类型。

更多信息: http: //www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Response-Headers.html

于 2010-05-13T17:53:12.577 回答
0

元标记不是浏览器所看到的。尝试使用 scriptlet 设置响应对象的内容类型。这个页面有一些建议。

于 2010-05-13T18:02:11.917 回答
0

如果必须使用 JSP:

您可以将输出流存储到具有随机生成名称的文件中,然后在 JSP 中引用该文件。您需要确保输出目录位于 Web 服务器的路径中。

这也有其自身的问题:

  • 您需要以删除旧文件的方式管理文件系统(这样您的服务器磁盘就会被填满)。
  • 您需要管理文件的同步(没有两个服务器线程应该更新同一个文件)。
  • 哦,你必须确保一个用户生成的图像不会被另一个用户看到。

我见过很多人做这种事情,我敢肯定有一个图书馆。

于 2010-05-13T18:27:32.797 回答