Используя iText, генерируйте в памяти PDF-файл, который генерируется на диске - PullRequest
4 голосов
/ 28 января 2010

Я генерирую PDF из приложения Java. (И прекрасно работает) проблема в том, что PDF создается на диске как:

        Document documento = new Document(PageSize.A4, 25, 25, 25, 25);
        PdfWriter writer = PdfWriter.getInstance(documento, new FileOutputStream("/Users/sheldon/Desktop/Registry.pdf"));
        documento.open();

        // Put some images on the PDF
        for( byte[] imagen : imagenes )
        {
            Image hoja = Image.getInstance(imagen);
            hoja.scaleToFit(documento.getPageSize().getHeight(), documento.getPageSize().getWidth());
            documento.add(hoja);
        }

        documento.addTitle("Generated Registry!");

        documento.close();

Теперь, когда пользователь будет искать PDF и распечатывать его, мне не нужно сохранять его на диске. Мне нужно (если возможно) сгенерировать их в памяти и использовать команду, чтобы открыть (с помощью Acrobat Reader) этот документ.

Это возможно? Любая идея.

Если нет, то какие предложения (по вашему опыту) есть.

Спасибо заранее.

EDIT:

Для стандартного Java-приложения для настольных компьютеров.

Ответы [ 5 ]

8 голосов
/ 04 марта 2010

Если вы не хотите, чтобы iText генерировал ваш документ на диск, просто сделайте это:

Document documento = new Document(PageSize.A4, 25, 25, 25, 25);
ByteArrayOutputStream out = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(documento, out);
(...)
return out.getBytes();

Это вам не поможет, так как Reader не сможет получить к нему доступ, пока вы не напишите его в Acrobat. Если вы не хотите, чтобы это было на диске, подключите виртуальный диск и запишите туда свои файлы. Как вы это сделаете, зависит от вашей операционной системы.

5 голосов
/ 28 января 2010

Чтобы это работало, Acrobat должен иметь доступ к памяти другого процесса (Java). Это невозможно.

Возможно, вы просто захотите записать файлы во временный каталог системы.

Если ваше приложение остается открытым после открытия PDF-файла в Acrobat, вы можете использовать комбинацию File.createTempFile() и File.deleteOnExit(), чтобы удалить файл после завершения JVM.

5 голосов
/ 28 января 2010

Да ... это довольно просто. Вам просто нужно передать содержимое обратно запрашивающей стороне (т. Е. Через объект Response в сервлете). Вам также нужно установить заголовок

'Content-type: application/pdf'

Возможно, вы также захотите установить его, чтобы он не открывался в браузере

'Content-Disposition: attachment; filename="downloaded.pdf"'
2 голосов
/ 09 февраля 2010

Я не JAVA-программист, но сейчас я немного работаю с iText, и у меня возник тот же вопрос. Я подумал, что если pdfWriter нужен только outputStream, он может также использовать java.io.ByteArrayOutputStream. Это было бы новым ByteArrayOutputStream (), я думаю, в JAVA, поскольку я использую ColdFusion.

Для меня это работает.

0 голосов
/ 14 сентября 2016

Требование может предъявляться к веб-приложению, где пользователи могут загружать PDF-файл, созданный во время выполнения. File.createTempFile() может создать большое число для временных файлов, а File.deleteOnExit() будет вызываться только при выходе из JVM - не идеальный сценарий.

В таких случаях будет разумно реализовать то, что предложено @ behe , и наконец написать ByteArrayOutputStream объект в ServletOutputStream.

ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();

//get ByteArrayOutputStream from behe's code snippet
ByteArrayOutputStream bout = (...)
bout.writeTo(servletOutputStream);

httpServletResponse.setContentType("application/octet-stream");
httpServletResponse.setHeader("Content-Disposition", "attachment;filename=\"" + <fileName> + "\"");
...