2012-03-12 77 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 
相关问题