2012-03-16 3 views
1

Я почти нахожусь (я думаю) о возможности визуализации PDF-файла с помощью сервлета, не сохраняя его в первую очередь. Я смог успешно настроить его, но я застрял в попытке сделать PDF открытым в браузере клиента с помощью диалогового окна печати.iText/flying-saucer PdfStamper с использованием OutputStream

Я был в состоянии послать свой PDF клиенту успешно со следующим:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = builder.parse(new StringBufferInputStream(buf.toString())); 

OutputStream os = resp.getOutputStream(); 

ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocument(doc, null); 
renderer.layout(); 
renderer.createPDF(os); 

os.close(); 

Но, я не знаю, как поставить диалог печати на открытой его. Я использовал этот код для PDF файла физического, но мне нужно, чтобы иметь возможность прочитать содержимое OutputStream в виде массива байтов для ввода в PdfReader (я думаю):

PdfReader reader = new PdfReader("a_physical_file.pdf"); 
PdfStamper stamper = new PdfStamper(reader, os); 
stamper.setPageAction(PdfWriter.PAGE_OPEN, new PdfAction(PdfAction.PRINTDIALOG), 1); 
stamper.close(); 

Не знаю, как сделать это с помощью OutputStream, а не фактического файла ...

Я также создал чат IText, если вы хотели бы размещать там: http://chat.stackoverflow.com/rooms/8945/itext

ответ

3

Предупреждения: Я использую старую версию из Itext, поэтому мой опыт может быть неприменим.

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

С уважением

Изменить: Что касается вашего вопроса:

я делаю это другие наоборот: я работаю на ByteArrayOutputStream, а затем писать его в поток ответа:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
// creating/modifying the pdf 
... 
byte[] pdfoutput = out.toByteArray(); 
res.setContentLength(pdfoutput.length); 
res.getOutputStream().write(pdfoutput); 

Изменить 2: окончательное решение (из чата)

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document doc = builder.parse(new StringBufferInputStream(buf.toString())); 

OutputStream os = new ByteArrayOutputStream(); 
ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocument(doc, null); 
renderer.layout(); 
renderer.createPDF(os); 
os.close(); 

PdfReader reader = new PdfReader(((ByteArrayOutputStream)os).toByteArray()); 
OutputStream out = new ByteArrayOutputStream(); 
PdfStamper stamper = new PdfStamper(reader, out); 
stamper.setPageAction(PdfWriter.PAGE_OPEN, new PdfAction(PdfAction.PRINTDIALOG), 1); 
stamper.close(); 

resp.getOutputStream().write(((ByteArrayOutputStream)out).toByteArray()); 
+0

Я изучал использование ByteArrayOutputStream, но мне трудно понять, как взять 'resp.getOutputStream()' и преобразовать его в ByteArrayOutputStream. Вы знакомы с тем, как это сделать? –

+0

Я хотел бы сделать это таким образом, но летающая тарелка использует OutputStream для всего его рендеринга. Наверное, я действительно смотрю, как я могу взять этот OutputStream после 'renderer.createPDF (os); 'и преобразовать его в формат, который PdfReader может прочитать (byte [], InputStream или URL из того, что я вижу). Я прочитал о преобразовании OutputStream в InputStream, но я смущен тем, как его реализовать. Не могли бы вы присоединиться ко мне в чате по адресу http://chat.stackoverflow.com/rooms/8945/itext? –

+0

Эй, я не могу найти класс PdfReader, где они выразились? – William

1

Вместо использования PdfStamper, почему бы вам не реализовать PDFCreationListener flyingsacuer для массажа любого созданного pdf. Вы можете получить экземпляр PdfWriter и установить диалог печати из класса реализации.

От Javadoc из PDFCreationListener

PDFCreationListener является обратным вызовом слушателем для создания PDF. Чтобы использовать это, вызовите ITextRenderer.setListener (PDFCreationListener). Обратите внимание, что с дескриптором экземпляра ITextRenderer (предоставленным в аргументах обратного вызова) вы можете получить доступ к экземпляру com.lowagie.text.pdf.PdfWriter, который используется для создания документа, используя ITextRenderer.getOutputDevice(), затем вызывает ITextOutputDevice.getWriter().

Связанная тема here.

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