2013-12-16 3 views
3

Я создаю PDF-файл в веб-приложении Java EE с целью затем связать пользователя с ним. Я понимаю, что доступ к файловой системе из Java EE не рекомендуется из-за возможных проблем с доступностью в распределенных системах и т. Д. Это не должно быть проблемой, так как это всегда будет выполняться на одном сервере. Тем не менее, мне интересно, как лучше всего достичь того, к чему я стремлюсь.Где хранить сгенерированный PDF в Java EE

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

Я использую PDFBox для создания PDF.

Я пробовал хранить его в файловой системе относительно корня, однако я работаю над окнами с NetBeans, что доказывает проблему. Сервер, конечно, основан на Linux, и я еще не тестировал его. Возможно, он работает на сервере, я просто пытаюсь понять, почему это не будет работать в Windows. Под «не работает» я имею в виду, что, когда я сохранить файл, я использую этот код:

myDocument.save("/var/PDFTEST2.pdf"); 

и сохраняет файл в C: /var/PDFTEST2.pdf, однако это inacceible от запущенное приложение.

Мои вопросы:

Что такое считается приемлемым способом хранения и представить сгенерированные файлы в приложении Java EE? Если это то, что я делаю (что я сомневаюсь), тогда можно ли заставить это работать в Windows?

Благодарю вас за ваше время.

Я решил это, благодаря предложению потоковой передачи файла на ответ. PDFBox позволяет вам «экономить» непосредственно на выходной поток:

ByteArrayOutputStream output = new ByteArrayOutputStream(); 
PDDocument myDocument = new PDDocument(); 

//Populate PDDocument... 

myDocument.save(output); 
myDocument.close(); 

response.setContentType("application/pdf"); 

//response.addHeader("Content-Type", "application/force-download"); //--< Use this if you want the file to download rather than display 
response.addHeader("Content-Disposition", "inline; filename=\"yourFile.pdf\""); 
response.getOutputStream().write(output.toByteArray()); 

Работал красиво!

+0

Как долго вы хотите, чтобы файл сохранялся? В течение часа, дня, продолжительности сеанса пользователя? – siledh

+0

@siledh Любой из вышеперечисленных.Они будут использовать и распечатывать файл немедленно, поэтому не нужно, чтобы он сохранялся прошлым при их просмотре (сразу) – MasNotsram

+0

Итак, храните его в памяти в качестве атрибута запроса или сеанса – siledh

ответ

3

Он недоступен, поскольку он не является частью корневой папки веб-сайта, поэтому веб-сервер/контейнер не может обслуживать этот файл через Интернет. Но вы можете добавить сервлет, который читает PDF с диска и передает его в ответ. Google для «FileServlet» или «ImageServlet» предоставит вам множество примеров для копирования и вставки.

Обычный пример: http://balusc.blogspot.nl/2009/02/fileservlet-supporting-resume-and.html

+0

Ваше предложение по потоковой передаче этого ответа сделало что-то щелчком в моей голове и, к счастью, заставил мою глупость уйти. Я исследовал, и я могу передать поток вывода в PDFBox, чтобы сохранить, а затем вывести это в порядке. Большое спасибо. – MasNotsram

2

Что о создании временного файла с помощью File.createTempFile()? Вот пример, взятый из here:

public void parse(
     InputStream stream, ContentHandler handler, 
     Metadata metadata, ParseContext context) 
     throws IOException, SAXException, TikaException { 
    File tmpFile = File.createTempFile("pdfbox-", ".tmp", null); 
    RandomAccess scratchFile = new RandomAccessFile(tmpFile, "rw"); 

    PDDocument pdfDocument = 
     PDDocument.load(new CloseShieldInputStream(stream), scratchFile, true); 

    try { 
     if (pdfDocument.isEncrypted()) { 
      try { 
       String password = metadata.get(PASSWORD); 
       if (password == null) { 
        password = ""; 
       } 
       pdfDocument.decrypt(password); 
      } catch (Exception e) { 
       // Ignore 
      } 
     } 
     metadata.set(Metadata.CONTENT_TYPE, "application/pdf"); 
     extractMetadata(pdfDocument, metadata); 
     PDF2XHTML.process(pdfDocument, handler, metadata, extractAnnotationText, enableAutoSpace); 
    } finally { 
     pdfDocument.close(); 
     scratchFile.close(); 
     tmpFile.delete(); 
    } 
} 

Посмотрите на temp.deleteOnExit();

PS: Существует ошибка в Java версий между 1.7.0_25 и 1.7.0_45, где временные файлы не работает должным образом ,

+0

Приятный пример, спасибо. Мне удалось решить это, написав непосредственно поток вывода, но я искал, как создавать временные файлы, и это очень полезно. Приветствия. – MasNotsram

+0

также взгляните на 'temp.deleteOnExit();'. – aphex

Смежные вопросы