显示存储在 ByteArrayOutputStream(而不是文件)中的 PDF 文档

Display PDF document stored in a ByteArrayOutputStream (not in a file)

我已经在文件中创建了一个 PDF 文档(使用 iText)并可以在屏幕上显示:

Document document = new Document();       
PdfWriter.getInstance(document, filename);
document.open();
// ... write something to document
document.close();
Desktop.getDesktop().open(new File(filename));  // works fine  :-)

但是在客户的机器上我的程序将无法访问文件系统,所以我尝试了这个:

Document document = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document,baos);
document.open();
// ... write something to document
document.close();

哪个有效,但是然后(当然)

Desktop.getDesktop().open(new File(baos));  //doesn't work :-(

Desktop.getDesktop().open无法显示 PDF。

有没有办法显示存储在 ByteArrayOutputStream 中的 PDF?

Adobe Reader 等 PDF 查看器需要文件系统上的 PDF。即使 PDF 是通过 Web 服务器提供的,Adobe Reader 也会将本地版本下载到客户端计算机。

Adobe Reader 等 PDF 查看器不接受字节流。您无法打开 Adob​​e Reader 和 "serve" 字节流。您必须始终传递文件路径。

您可以通过网络服务器向浏览器提供 PDF 来解决此问题。如评论中所述,您可以使用 ServerSocket 在 Java 中创建自己的 Web 服务器,但是:

  1. 防火墙通常会抱怨这个。突然开始充当网络服务器的应用程序被认为是可疑的。
  2. Adobe 的 EULA Reader 禁止在创建和提供 PDF 的同一台机器上使用 Adob​​e Reader。因此,您必须确保您的用户不使用 Adob​​e Reader,否则他们将违反 Adob​​e Reader.
  3. 的 EULA

特别是最后一个限制使Joop Eggen void. See section 3.2 of the EULA for Adobe Reader DC发表评论:

3.2 Server Use. This agreement does not permit you to install or Use the Software on a computer file server.

此条款是在 Adob​​e 发现人们正在构建允许人们使用免费的 Adob​​e Reader 来提供仅在 Adob​​e Professional(不是免费的)中可用的功能的本地服务器产品之后添加的。

长话短说:您正在尝试做一些最常见的 PDF 查看器无法做到的事情。您必须将您的应用程序与自定义 PDF 查看器一起发布。