如何使用打印对话框打开使用flying-saucer / itext创建的PDF

时间:2012-03-12 17:39:11

标签: java itext flying-saucer

可以在Check printing with Java/JSPCreate a "print-only" PDF with itext 找到此问题的一些背景信息

我已经能够使用iText-2.0.8和以下代码使用打印对话框成功创建和打开PDF:

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

我还可以使用fly-saucer使用以下代码从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并打开对话框?

3 个答案:

答案 0 :(得分:3)

您可以实现飞碟的org.xhtmlrenderer.pdf.PDFCreationListener,并在preWrite(ITextRenderer iTextRenderer,int 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);

希望这有帮助。

答案 1 :(得分: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();
    }
}

答案 2 :(得分:0)

对飞碟文件的修改。

PDDocument document = ...;

PDPage firstPage = document.getPage(0);
PDPageAdditionalActions actions = firstPage.getActions();
actions.setO(new PDActionJavaScript("this.print(true);\r")); // O for open