Я использую 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, не возвращает ошибок. PDF-файл после загрузки возвращает вышеуказанные ошибки.
Пожалуйста, помогите, заранее спасибо!
Поскольку ваш комментарий в последующем вопросе предполагает, что maven повреждает ваш PDF-файл во время сборки архива .war, я бы посоветовал вам отключить фильтрацию ресурсов maven во время сборки для файлов PDF в вашем 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: См. этот Q / A для фона..
Например, поместите документацию 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 обычно не следует фильтровать.
Почему два ответа? Зная, что я мог бы отредактировать первый ответ, включив в него оба предложения, я хотел бы знать, какое из них принято, если таковое имеется.
Большое спасибо за ответ. Оно работало завораживающе.
Норепро. По крайней мере, не в совершенно пустом проекте с абсолютным минимумом необходимых библиотек/конфигураций для этой цели. Первое, что нужно проверить, это наличие в вашем реальном проекте каких-либо фильтров сервлетов, которые манипулируют ответом.