技术开发 频道

从Flex 应用程序创建PDF文档

【IT168技术资讯】有三种方法可以从 Adobe Flex 应用程序创建 PDF 文档:

    (1)通过使用 forms/LiveCycle设计器——这个过程具有详细的记录,要求创建 XDP form(一种 Acrobat XML Data Package文件)和数据模型,并创建同步Flex应用程序和 LiveCycle 的过程;
    
    (2)通过将 PDF 打印作为 Flex 应用程序的一个功能,无缝提供打印功能(使用或不使用 LiveCycle Designer);

    (3)通过使用 LCDS 中的 Snapshots,它使用位图表示 Flash 内容。

    虽然第一种过程可保证质量和可预测的结果,但是它也需要付出双倍的努力来开发 XDP 和 Flex form,而且引入了与应用程序域无关的模型和通信。

    由于屏幕快照使用较低的 DPI,第三种打印类型适合仅用于屏幕显示的 PDF。Flex 3 应该提供对 DPI 分辨率的控制。

    当文档结构是动态的时(比如终端用户可自定义的报告或表格),第二种过程更适合。它通常使用当前版本的 LiveCycle Data Services ES(以前为 Flex Data Services)Flex,该过程通常生成更好的打印质量。其思想是,不向服务器发送用于与表单合并的数据,而是以包含数据和格式的 XDP 格式发送已经合并的压缩文档。在这种情况下,LCDS 层只需使用 XDPXFAHelper 类处理它,并将其以PDF流返回到浏览器进行显示。
下一个代码示例是 JavaServer Page (createPDF.jsp) 的服务器端部分。注意,您需要 LCDS 的商业许可版本,因为其 Express 版本不支持 PDF 生成。

 

<%@ page language="java"
import="java.io.IOException,
javax.servlet.http.HttpServletRequest,
flex.acrobat.pdf.XDPXFAHelper,
java.util.zip.Inflater,
java.util.zip.InflaterInputStream"
%>
<jsp:directive.page import="java.io.InputStream"/>
<jsp:directive.page import="java.io.ByteArrayInputStream"/>
<jsp:directive.page import="java.io.FileInputStream"/>
<jsp:directive.page import="java.io.FileOutputStream"/>
<%
//Load compressed XDP stream (received from client)
//into a byte array
byte[] result = new byte[5000000];
int resultLength =0 ;
try {
Inflater decompresser = new Inflater( );
byte[] ba = new byte[500000];
ServletInputStream si = request.getInputStream();
int k = 0;
int i = 0;
while (true ) {
k = si.read(ba, i, 500000);
i +=k;
if (k<=0) break;
}
try {//Uncompress data into result
decompresser.setInput(ba);
resultLength = decompresser.inflate(result);
} catch (Exception e) {
System.out.println(e.getMessage());
}
} catch (IOException e) {
throw new ServletException(e);
}

//The next line won’t work unless you have a commercial
// LCDS. It’s not available in Express edition
XDPXFAHelper helper = new XDPXFAHelper();

try { //load the input into PDF convertor
helper.openFromByteArray( result );
} catch (Exception e) {
e.printStackTrace();
}

// Save new PDF as a byte array
byte[] bytes = helper.saveToByteArray();

//Send PDF to the client(GZIP compression can be
// provided by an external filter)
ServletOutputStream out2 = response.getOutputStream();
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
out2.write(bytes);
out2.flush();
out2.close();
%>

0
相关文章