2012-03-12 3 views
2

Некоторого фон на этот вопрос можно найти в Check printing with Java/JSP и Create a "print-only" PDF with itextКак открыть PDF, созданный с помощью летающего блюдца/IText с диалогом печати

я смог успешно создать и открыть PDF с печатью диалог с использованием IText-2.0.8 и следующий код:

String outputFile = "firstdoc.pdf"; 
Document document = new Document(); 
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outputFile)); 
writer.setOpenAction(new PdfAction(PdfAction.PRINTDIALOG)); 
document.open(); 
document.add(new Paragraph("TEST")); 
document.close(); 

Я также был в состоянии использовать летающее блюдце для создания PDF из XHTML, используя следующий код:

String inputFile = "firstdoc.xhtml"; 
String url = new File(inputFile).toURI().toURL().toString(); 
String outputFile = "firstdoc.pdf"; 

OutputStream os = new FileOutputStream(outputFile); 

ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocument(url); 
renderer.layout(); 
renderer.createPDF(os); 

os.close(); 

Однако, я не могу показаться, чтобы получить два работать вместе ...

Я хотел бы создать PDF с помощью летающего блюдца, как во 2-м блоке кода и Я хотел бы установить открытое действие этого PDF до PdfAction.PRINTDIALOG.

Как я могу заставить эти два набора кода работать вместе так, чтобы созданный PDF-файл с летающими блюдца начинался с диалогового окна печати?

ответ

2

Фигурные это ...

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

Вот полный код, который работал для меня:

import java.io.*; 

import com.lowagie.text.Document; 
import com.lowagie.text.DocumentException; 
import com.lowagie.text.Paragraph; 
import com.lowagie.text.pdf.PdfWriter; 
import com.lowagie.text.pdf.PdfAction; 
import com.lowagie.text.pdf.PdfReader; 
import com.lowagie.text.pdf.PdfStamper; 

import org.xhtmlrenderer.pdf.ITextRenderer; 

import java.io.FileOutputStream; 
import java.io.IOException; 

public class FirstDoc { 

    public static void main(String[] args) throws IOException, DocumentException { 

     String inputFile = "firstdoc.xhtml"; 
     String url = new File(inputFile).toURI().toURL().toString(); 
     String outputFile = "firstdoc.pdf"; 

     OutputStream os = new FileOutputStream(outputFile); 

     ITextRenderer renderer = new ITextRenderer(); 
     renderer.setDocument(url); 
     renderer.layout(); 
     renderer.createPDF(os); 

     os.close(); 

     PdfReader reader = new PdfReader(outputFile); 
     PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("firstdocprint.pdf")); 
     stamper.setPageAction(PdfWriter.PAGE_OPEN, new PdfAction(PdfAction.PRINTDIALOG), 1); 
     stamper.close(); 
    } 
} 
+1

Большое спасибо, ваше сообщение помогло мне решить мою проблему. Однако нет необходимости создавать второй PDF-файл, если только вы хотите распечатать PDF-файл. Я сделал это ниже, чтобы избежать создания двух PDF-файлов: OutputStream os = new FileOutputStream (outputFile); ByteArrayOutputStream outputStreamForPrinter = new ByteArrayOutputStream(); PdfReader reader = новый PdfReader (os.toByteArray()); PdfStamper stamper = новый PdfStamper (считыватель, outputStreamForPrinter); –

3

Вы можете реализовать org.xhtmlrenderer.pdf.PDFCreationListener из летающей тарелки и написать диалог печати код, связанный в preWrite метод (ITextRenderer iTextRenderer, внутр PAGECOUNT) ,

@Override  
public void preWrite(ITextRenderer iTextRenderer, int pageCount) 
{ 
    iTextRenderer.getOutputDevice().getWriter().setOpenAction(new PdfAction(PdfAction.PRINTDIALOG)); 
} 

Добавить слушатель в ITextRenderer

ITextRenderer renderer = new ITextRenderer(); 
renderer.setListener(PDFCreationListener implemetation class); 
    renderer.setDocumentFromString(htmlContent); 
    renderer.layout(); 
    renderer.createPDF(os); 

Надеется, что это помогает.

0

Модификация летающих тарелок документа.

PDDocument document = ...; 

PDPage firstPage = document.getPage(0); 
PDPageAdditionalActions actions = firstPage.getActions(); 
actions.setO(new PDActionJavaScript("this.print(true);\r")); // O for open 
Смежные вопросы