2012-03-12 47 views
2

一些背景對這個問題可以在Check printing with Java/JSP被發現和Create a "print-only" PDF with itext如何打開與飛碟/ iText的創建PDF文件使用的打印對話框

我已經能夠與打印成功創建和打開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(); 

我也已經能夠使用的飛碟使用下面的代碼生成從XHTML一個PDF:

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 我想設置該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文件。我在下面做了以避免創建2個PDF文件: OutputStream os = new FileOutputStream(outputFile); ByteArrayOutputStream outputStreamForPrinter = new ByteArrayOutputStream(); PdfReader reader = new PdfReader(os.toByteArray()); PdfStamper stamper = new PdfStamper(reader,outputStreamForPrinter); – 2014-10-15 12:01:01

3

您可以實現飛碟的org.xhtmlrenderer.pdf.PDFCreationListener和寫入預寫您的打印對話框相關的代碼(ITextRenderer iTextRenderer,詮釋頁頁次)方法。

@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 
相關問題