Wicket添加了一个大的Pdf作为资源

时间:2012-09-12 09:58:45

标签: java pdf wicket

在我的应用程序中,我使用ByteArrayResource显示pdf。 这工作正常,直到我开始使用更大的文件。转换为ByteArray不断给我一个内存不足的错误。

这就是我现在这样做的方式:

        File myPdf=new File(thePath);
        FileInputStream fin = new FileInputStream(myPdf);
        final byte fileContent[] = new byte[(int)myPdf.length()];
        fin.read(fileContent);
        fin.close();
        ResourceReference rr = new ResourceReference(dePdf.getName()) {

        @Override
        public IResource getResource() {
            return new ByteArrayResource("Application/pdf", fileContent);

        }
        };
        if (rr.canBeRegistered()) {
            getApplication().getResourceReferenceRegistry().registerResourceReference(rr);
        }        

        return wmc;

有更好的方法来显示大文件吗?

2 个答案:

答案 0 :(得分:4)

尝试使用ResourceStreamResource和FileResourceStream:

File myPdf=new File(thePath);
FileResourceStream frs = new FileResourceStream(myPdf);

ResourceStreamResource rsr = new ResourceStreamResource(frs);
rsr.setContentDisposition(ContentDisposition.ATTACHMENT);
rsr.setFileName(fileName);

//the same code for resource reference creation and registration
//...

答案 1 :(得分:1)

不完全确定(从未真正使用过它们)但ContextRelativeResource可能是一种选择。也许是这样的事情:

final File myPdf=new File(thePath);
        ResourceReference rr = new ResourceReference(dePdf.getName()) {

        @Override
        public IResource getResource() {
            // You'll need to adjust the path here to be relative to your context
            return new ContextRelativeResource(myPdf.getAbsolutePath());

        }
        };
        if (rr.canBeRegistered()) {
            getApplication().getResourceReferenceRegistry().registerResourceReference(rr);
        }