我的要求是创建与数据库的一些数据,我利用iText做一个动态的报告PDF文件。 现在,我要显示在网页中非常久远菜单,页眉,页脚,等这个pdf文件内嵌
所以,如果用户有一定的PDF阅读器,然后阅读本应显示在用户机器打印选项来打印PDF文件。
我的要求是创建与数据库的一些数据,我利用iText做一个动态的报告PDF文件。 现在,我要显示在网页中非常久远菜单,页眉,页脚,等这个pdf文件内嵌
所以,如果用户有一定的PDF阅读器,然后阅读本应显示在用户机器打印选项来打印PDF文件。
这是我正在做这件事。 你可以调用一个iframe中或在常规的JSP这个动作
public class GeneratePdf extends ActionSupport{
private InputStream inputStream;
public String execute(){
HttpServletResponse response = ServletActionContext.getResponse();
Document document = new Document();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try {
PdfWriter.getInstance(document, buffer);
document.open();
// do your thing
document.close();
} catch (DocumentException e) {
e.printStackTrace();
}
byte[] bytes = null;
bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
if(bytes!=null){
inputStream = new ByteArrayInputStream ( bytes );
}
return SUCCESS;
}
public InputStream getInputStream() {
return inputStream;
}
}
在你的struts.xml
<action name="GeneratePdf" class="com.xxx.action.GeneratePdf">
<result name="success" type="stream">
<param name="contentType">application/pdf</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">filename="test.pdf"</param>
<param name="bufferSize">1024</param>
</result>
</action>
public ByteArrayInputStream generatePDF(List<Object> items) {
try {
List<InputStream> listInputStream = new ArrayList<InputStream>();
for (int i = 0; i < items.size(); i++) {
listInputStream.add(new ByteArrayInputStream(getBytes(items.get(i)));
}
HttpServletResponse response = ServletActionContext.getResponse();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, buffer);
document.open();
PdfContentByte cb = writer.getDirectContent();
for (InputStream inputStream : listInputStream) {
PdfReader reader = new PdfReader(inputStream);
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
document.setPageSize(reader.getPageSize(i));
document.newPage();
PdfImportedPage page = writer.getImportedPage(reader, i);
cb.addTemplate(page, 0, 0);
}
}
document.close();
byte[] bytes = null;
bytes = buffer.toByteArray();
response.setContentLength(bytes.length);
return new ByteArrayInputStream(bytes);
} catch(Exception e){
System.out.println(e);
}
}
我使用的是一个动作做inputStream
为阿努建议。 并使用PDF.JS库。
在线演示
GitHub上