2016-08-03 6 views
0

Я использую xdocreport для создания pdf документа из *.docx файлов. Я использую struts2 для реализации. Я следовал за этим https://github.com/opensagres/xdocreport/wiki/DocxReportingStruts2Как сохранить сгенерированный PDF-файл в каталоге веб-приложений [xdocreport]?

У меня есть это работает правильно, он делает генерировать pdf и заполняет docx файлы всем от Явы.

Моя проблема: после того, как цикл завершен, он выдает сгенерированный файл непосредственно пользователю для загрузки. Итак, как только xdocreport генерирует все, браузер пользователя начнет его загружать.

Вместо этого я хочу генерируемый pdf быть сохранены в веб-приложение [или в том же диске отдельную папку] каталог, а затем оттуда я хотел бы спросить пользователя, если он хочет, чтобы загрузить его или нет, если он нажимает «да», а затем загрузите его. Кроме того, я должен иметь резервную копию сгенерированного документа, поэтому мне нужно как-то сначала сгенерировать и сохранить его в веб-приложении [или в той же папке с отдельными дисками] и после этого предоставить его пользователю.

Как я могу изменить его поведение?

EDIT1 [на основе ниже ответ]:

Так что теперь он бросает это исключение, но даже если он бросает ее, я могу видеть, преобразованный PDF, показанный в браузере, но я не могу открыть сам документ в формате PDF, который генерируется в файловой системе.

* ERROR 2016-08-04 09:33:16,079 ExceptionConverter: org.eclipse.jetty.io.EofException (XWPF2PDFViaITextConverter.java [qtp559888791-19]) 
* ERROR 2016-08-04 09:33:16,096 Error while executing action (ExceptionInterceptor.java [qtp559888791-19]) 
fr.opensagres.xdocreport.converter.XDocConverterException: org.apache.poi.xwpf.converter.core.XWPFConverterException: ExceptionConverter: org.eclipse.jetty.io.EofException 
at  fr.opensagres.xdocreport.converter.docx.poi.itext.XWPF2PDFViaITextConverter.convert(XWPF2PDFViaITextConverter.java:72) 
at fr.opensagres.xdocreport.document.AbstractXDocReport.convert(AbstractXDocReport.java:713) 
at org.apache.struts2.views.xdocreport.AbstractXDocReportResult.doProcessReportWithConverter(AbstractXDocReportResult.java:561) 
at org.apache.struts2.views.xdocreport.AbstractXDocReportResult.doExecute(AbstractXDocReportResult.java:284) 
at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:191) 
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:369) 
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:273) 
+0

Сохранение чего-либо в каталоге веб-приложений - ужасная идея. Если у вас заканчивается неиспользуемый файл WAR, нет каталога веб-приложений. Если вы должны сохранить на диск, вы должны использовать системное свойство java.io.tmpdir и убедиться, что оно правильно установлено в вашем развертывании. –

+0

@JimGarrison, согласитесь. Я мог бы создать отдельную папку на одном диске, но вопрос остается тем же. Как можно изменить поведение «xdoxreport», чтобы сначала сохранить сгенерированный файл на стороне сервера? – Daler

ответ

1

Как вы можете видеть на странице, вы дали ссылку, вы можете установить пары скачать на ложь, и что будет отключить загрузку.

<action name="DisplayProject" class="example.DisplayProject"> 
    <result name="success" type="xdocreport"> 
    <param name="location">/docx/DocxProjectWithVelocityList.docx</param> 
    <param name="templateEngine">Velocity</param> 
    <param name="fieldAsList">developers.Name,developers.LastName</param> 
    <param name="download">false</param> 
</result> 

и сохранить файл в папке веб-приложения, я думаю, вы можете

public void populateContext(IXDocReport report, IContext context) 
     throws Exception { 
context.put("project", getProject()); 
context.put("developers", getDevelopers()); 

try (FileOutputStream fOut = new FileOutputStream(servletContext.getRealPath("/") + "filename")) { 
    report.process(context, fOut); 
} catch (Exception e) { 
    // Handle exception 
} 

}

Всего предположения, не тестируются.

+0

thx. Теперь я получаю EofException .. обновил свой пост. – Daler

+0

Это полное исключение? Он все еще отправляет файл в браузер? –

+0

нет, он не отправляет его в браузер в качестве загрузки. Он просто показывает файл, открытый в браузере, и у меня также есть сгенерированный файл PDF, и я тоже могу его открыть.Итак, теперь он работает, но по какой-то причине он генерирует это исключение после того, как задание выполняется где-то около 20-30 секунд после – Daler