【问题标题】:How to open PDF created with flying-saucer/itext with a print dialog如何使用打印对话框打开使用飞碟/itext 创建的 PDF
【发布时间】:2012-03-12 17:39:10
【问题描述】:

这个问题的一些背景可以在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();

我还能够使用飞碟通过以下代码从 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 最初会打开一个打印对话框?

【问题讨论】:

    标签: java itext flying-saucer


    【解决方案1】:

    您可以实现飞碟的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);
    

    希望这会有所帮助。

    【讨论】:

      【解决方案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();
          }
      }
      

      【讨论】:

      • 非常感谢,您的帖子帮助我解决了我的问题。但是,如果您只想打印 PDF,则无需创建第二个 PDF 文件。我在下面做了以避免创建 2 个 PDF: OutputStream os = new FileOutputStream(outputFile); ByteArrayOutputStream outputStreamForPrinter = new ByteArrayOutputStream(); PdfReader 阅读器 = 新 PdfReader(os.toByteArray()); PdfStamper stamper = new PdfStamper(reader, outputStreamForPrinter);
      【解决方案3】:

      修改飞碟文档。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-20
        • 2011-06-04
        • 2016-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-25
        相关资源
        最近更新 更多