我正在使用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返回上述错误。
请帮助,谢谢!
答案 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。
为什么有两个答案?知道我可以编辑第一个答案以包含两个建议,所以我想知道哪个(如果有)可以接受。