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

Downloaded PDF from server is invalid although original is valid

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

Validating file "manual(6).pdf" for conformance level pdf1.7

The 'xref' keyword was not found or the xref table is malformed.

The file trailer dictionary is missing or invalid.

The "Length" key of the stream object is wrong.

Error in Flate stream: data error.

The "Length" key of the stream object is wrong.

The document does not conform to the requested standard.

The file format (header, trailer, objects, xref, streams) is corrupted.

The document does not conform to the PDF 1.7 standard.

Done.

我的代码适用于其他 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文件return没有错误。 下载后的pdfreturns以上错误

请帮忙,提前致谢!

由于 your comment in a followup question 建议 Maven 在构建 .war 存档期间损坏您的 PDF,我建议您必须在构建期间禁用 Maven 资源过滤 POM.xml:

<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>

另一种为下载提供静态文件的方法是使用 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

在您的网络项目中。现在在你的脸上简单地向这个文件添加一个静态输出链接:

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

就是这样。该文件将按原样提供,outputLink 实际上提供了对该文件的可收藏引用。

顺便说一句。还可以规避 maven 过滤问题,因为 /src/main/webapp/resources 通常不应被过滤。

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