尽管原始文件有效,但从服务器下载的PDF无效

时间:2019-01-29 09:19:37

标签: java pdf omnifaces

我正在使用Omnifaces创建pdf下载按钮并从服务器获取pdf。下载的pdf包含空白页,使用pdf验证器后出现此错误:

  

针对符合性级别pdf1.7的验证文件“ manual(6).pdf”

     

找不到'xref'关键字或外部参照表格式错误。

     

文件尾部字典缺失或无效。

     

流对象的“长度”键错误。

     

Flate流中的错误:数据错误。

     

流对象的“长度”键错误。

     

该文档不符合所要求的标准。

     

文件格式(标题,尾部,对象,外部参照,流)为   损坏。

     

该文档不符合PDF 1.7标准。

     

完成。

我的代码可用于其他pdf文件。

这是我的代码:

@ManagedBean
public class FileDownloadView {

    private static final String FILENAME = "manual.pdf";

    public void download() throws IOException {
        Resource resource = new ClassPathResource(FILENAME);
        File file = resource.getFile();
        Faces.sendFile(file, true);
    }

}

和xhtml:

<h:form>
    <p:commandButton action="#{fileDownloadView.download}" value="download" ajax="false">
    </p:commandButton>
</h:form>

由pdf验证程序扫描的原始pdf文件未返回任何错误。 下载后的pdf返回上述错误。

请帮助,谢谢!

2 个答案:

答案 0 :(得分:3)

由于your comment in a followup question建议在构建.war归档文件时maven破坏了PDF,因此我建议您在为POM.xml中的PDF文件构建过程中必须禁用maven资源过滤:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
            <exclude>*.pdf</exclude>
        </excludes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <includes>
            <include>*.pdf</include>
        </includes>
    </resource>
</resources>

答案 1 :(得分:2)

另一种为下载的文件提供静态文件的方法是使用JSF的内置资源系统:See this Q/A for background.

例如,将Primefaces 6.2文档放入/src/main/webapp/resources文件夹中(请注意,与我上面其他建议中的/src/main/resources相同,!),因此您有了一个文件:

/src/main/webapp/resources/primefaces_user_guide_6_2.pdf

在您的Web项目中。现在,只需将静态outputLink添加到此文件即可:

<h:outputLink value="#{resource['primefaces_user_guide_6_2.pdf']}" >Download PF 6.2 Documentation!</h:outputLink>

就是这样。该文件将按原样提供,并且OutputLink会为该文件提供可书签的引用。

这会顺便说一句。还规避了Maven过滤问题,因为通常不应过滤/ src / main / webapp / resources。

为什么有两个答案?知道我可以编辑第一个答案以包含两个建议,所以我想知道哪个(如果有)可以接受。