Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 显示存储在ByteArrayOutputStream(非文件)中的PDF文档_Java_Pdf_Itext_Bytearrayoutputstream - Fatal编程技术网

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

Java 显示存储在ByteArrayOutputStream(非文件)中的PDF文档,java,pdf,itext,bytearrayoutputstream,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)); //

我已经在文件中创建了一个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()显示PDF。请打开


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

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


PDF查看器(如Adobe Reader)不接受字节流。您无法打开Adobe Reader并向其“提供”字节流。必须始终传递文件的路径

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

  • 防火墙通常会抱怨这一点。突然开始充当web服务器的应用程序被认为是可疑的
  • Adobe Reader的EULA禁止在创建和提供PDF的同一台计算机上使用Adobe Reader。因此,您必须确保您的用户不使用Adobe Reader,否则他们将违反Adobe Reader的EULA
  • 特别是最后一个限制使得评论无效。见本手册第3.2节:

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

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


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

    您可以使用web服务器,在端口8080上安装一个ServerSocket,以及
    Desktop.getDesktop.browse(“http://localhost:8080/my.pdf)
    。您必须处理请求标题行,并发送自己的标题行,但浏览器开发工具将显示示例数据。web服务器不会在客户计算机上运行:-(您不能在端口上用java打开ServerSocket?我的意思是扮演Web服务器的角色,让浏览器打开pdf。@JoopEggen仅供参考:您的建议违反了第3.2条服务器使用条款:“本协议不允许您在计算机文件服务器上安装或使用该软件。”如果OP使用了你的建议,他必须确保他的用户不使用Adobe Reader。请参阅我的答案,以了解EULA中包含该条款的原因。@BrunoLowagie听到这一点很难过,但如果该字段中有人,那么就是你。
    Desktop.getDesktop().open(new File(baos));  //doesn't work :-(