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

时间:2016-04-01 18:17:14

标签: java pdf itext bytearrayoutputstream

我已经在一个文件中创建了一个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?

1 个答案:

答案 0 :(得分:2)

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

PDF Adob​​e Reader等查看器不接受字节流。您无法打开Adobe Reader和"服务"一个字节流到它。您必须始终将路径传递给文件。

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

  1. 防火墙通常会抱怨这一点。突然开始充当Web服务器的应用程序被认为是可疑的。
  2. Adob​​e Reader的EULA禁止在创建和提供PDF的同一台计算机上使用Adobe Reader。因此,您必须确保您的用户不使用Adobe Reader,否则他们将违反Adobe Reader的EULA。
  3. 特别是最后一个限制使得Joop Eggen的评论无效。请参阅EULA for Adobe Reader DC

    的第3.2节
      

    3.2服务器使用。本协议不允许您在计算机文件服务器上安装或使用本软件。

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

    长话短说:您正在尝试使用最常见的PDF查看器执行某些操作。您必须使用自定义PDF查看器发送应用程序。