2012-03-16 1 views
1

나는 그것을 저장하지 않고 서블릿으로 PDF를 렌더링 할 수 있다는 것에 거의 다 왔다고 생각한다. 성공적으로 설정할 수 있었지만 처음에는 인쇄 대화 상자를 사용하여 클라이언트의 브라우저에서 PDF를 열려고했습니다. 나는 그것의 개방에 인쇄 대화 상자를 넣어하는 방법을 모르겠어요iText/flying-saucer OutputStream을 사용하는 PdfStamper

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를 보낼 수있었습니다. 은 내가 물리적 PDF 파일이 코드를 사용했습니다,하지만 난에 PdfReader에 입력 바이트 배열 (내가 생각하는)으로의 OutputStream의 내용을 읽을 수 있어야합니다 :

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(); 

http://chat.stackoverflow.com/rooms/8945/itext

답변

3

경고 : 나는 이전 버전을 사용하는 당신이 게시하고자하는 경우 ... OutputStream에 아닌 실제 파일

을이 작업을 수행하는 방법을 잘 안 나는 또한 iText를 대화방을 만들었습니다 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 : (대화방)에서 최종 솔루션

,536,
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을 어떻게 가져갈 수 있는지보고 싶다.createPDF (os);'를 읽고 PdfReader가 읽을 수있는 형식 (byte [], InputStream 또는 URL)으로 변환하십시오. OutputStream을 InputStream으로 변환하는 것에 대해 읽었지만 실제로 구현하는 방법에 대해서는 혼란스러워합니다. 나 채팅에 http://chat.stackoverflow.com/rooms/8945/itext에 가입 하시겠습니까? –

+0

이봐, 나는 PdfReader 클래스를 찾을 수 없다. – William

1

PdfStamper를 사용하는 대신 생성 된 모든 PDF를 마사지하기 위해 flyingsacuer의 PDFCreationListener를 구현하지 않는 이유는 무엇입니까? PdfWriter 인스턴스를 가져 와서 구현 클래스 내에서 인쇄 대화 상자를 설정할 수 있습니다. PDFCreationListener

PDFCreationListener의 자바 독에서

는 PDF 생성을위한 콜백 리스너입니다. 이를 사용하려면 ITextRenderer.setListener (PDFCreationListener)를 호출하십시오. 콜백 인수에 제공된 ITextRenderer 인스턴스의 핸들을 사용하여 문서를 만드는 데 사용되는 com.lowagie.text.pdf.PdfWriter 인스턴스에 액세스 할 수 있습니다.ITextRenderer.getOutputDevice(), 다음 ITextOutputDevice.getWriter()를 호출하십시오.

관련 스레드는 here입니다.