Java 显示存储在ByteArrayOutputStream(非文件)中的PDF文档
我已经在文件中创建了一个PDF文档(使用iText),可以通过以下方式在屏幕上显示: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)); //
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 :-(