【问题标题】:Convert from PDF to Postscript using Java使用 Java 从 PDF 转换为 Postscript
【发布时间】:2010-01-15 15:53:18
【问题描述】:

我有一个基于 J2EE 的应用程序,我正在使用报告工具生成 PDF 格式的输出。我需要一个 Java 实用程序/工具,它可以帮助我将我的 PDF 文件转换为 postscript 格式,以便我可以将其打印到打印机上......我的应用程序将在各种操作系统(即 Windows / Linux / AIX)上运行,因此一个独立于平台的解决方案是必不可少的。我的报告工具不支持 PS 格式的输出。请指教...

【问题讨论】:

    标签: java pdf postscript


    【解决方案1】:

    AFAIK 对此没有万无一失的纯 Java 解决方案,但如果要在服务器端进行转换,我建议您使用 Ghostscript's pdf2ps 转换器。即使您必须安装特定于平台的 Ghostscript 版本,您也应该为所有提到的平台找到一个。

    【讨论】:

    • Ghostscript 是免费的,可以在所有平台上运行。在没有好的纯 Java pdf->ps 转换器的情况下,这是要走的路。
    【解决方案2】:

    这是我的纯 Java 解决方案。它在 CentOS、SUSE 和 Windows 7 上运行良好。无需安装任何软件。

    import java.io.File;
    import java.io.FileOutputStream;
    import javax.print.DocFlavor;
    import javax.print.DocPrintJob;
    import javax.print.SimpleDoc;
    import javax.print.StreamPrintService;
    import javax.print.StreamPrintServiceFactory;
    import javax.print.attribute.HashPrintRequestAttributeSet;
    import javax.print.attribute.PrintRequestAttributeSet;
    
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.printing.PDFPrintable;
    import org.apache.pdfbox.printing.Scaling;
    
    public class Printing {
    
    
            public static void main(String[] args) {
                try {
                DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
                String psMimeType = DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType();
                StreamPrintServiceFactory[] factories = StreamPrintServiceFactory.lookupStreamPrintServiceFactories(flavor, psMimeType);
    
                System.out.println ("Available PS services: " + factories.length);
                System.out.println ("Format: " + factories[0].getOutputFormat());
    
                FileOutputStream outStream = new FileOutputStream("/path/to/your.ps");
                StreamPrintService printService = factories[0].getPrintService(outStream);
    
    
                PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
                aset.add(MediaSizeName.NA_LETTER);              
    
                PDDocument doc = PDDocument.load(new File("/path/to/my.pdf"));
    
                SimpleDoc pdfDoc = new SimpleDoc(new PDFPrintable(doc, Scaling.SCALE_TO_FIT, false), flavor, null);
    
                DocPrintJob newJob = printService.createPrintJob();
                newJob.print(pdfDoc, aset);
    
                outStream.close();
    
                }
                catch(Exception ex) {
                    ex.printStackTrace();
                }
            }
    }
    

    依赖:

    dependencies {
        compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.8'
    }
    

    【讨论】:

      【解决方案3】:

      有几个 PDF 库可以打印 PDF。如果您打印到 Postscript 打印机并使用打印到文件选项,您最终可能会使用 Postscript。

      【讨论】:

        【解决方案4】:

        另一种“基于 exe”的解决方案,如 Ghostscript,是 Xpdf.PdfToPS
        PdfToPs 是一个纯命令行应用程序。在 Win、Linux 和 Solaris 上运行。
        http://www.foolabs.com/xpdf/

        【讨论】:

          【解决方案5】:

          使用 fop xslfo http://xmlgraphics.apache.org/fop/fop-pdf-images.html

          fop test.fo -ps out.ps

          test.fo:

          <?xml version="1.0" encoding="utf-8"?>
          <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
          
            <fo:layout-master-set>
              <fo:simple-page-master master-name="simple">
                <fo:region-body />
              </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="simple">
              <fo:flow flow-name="xsl-region-body">
          
             <fo:block>
              <fo:external-graphic src="my.pdf"/>
                </fo:block> 
          
              </fo:flow>
            </fo:page-sequence>
          </fo:root>
          

          【讨论】:

            【解决方案6】:

            谢谢,我已经尝试过这个选项,并且能够很好地将 pdf 转换为 postscript。我面临的唯一问题是,当我将此类文件发送到打印机时,如果 pdf 具有混合方向,例如某些纵向页面和某些横向页面,则转换后的 postscript 文件将以纵向模式或横向模式打印.它应该在打印时自动处理方向。

            打印ps文件的代码sn-p -

                DocPrintJob job = service.createPrintJob();
                try {
                    PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
                    File psFile = new File (psFilePath); 
                    InputStream inputStream = new FileInputStream(psFile);
                    Doc doc = new SimpleDoc(inputStream, DocFlavor.INPUT_STREAM.POSTSCRIPT ,null);
                    job.print(doc, attributes);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            

            【讨论】:

              【解决方案7】:

              也许考虑使用jasper reports

              它将允许您生成各种输出(PDF、Html、RTF)的报告。

              您还可以将报告导出到打印机。

              编辑:

              这是一个快速的example,我发现使用JRPrintServiceExporter 导出到打印机,而不是使用PDF 导出器。看起来它可以完成这项工作。

              【讨论】:

              • 这是一个可能对从 Jasper 生成 PS 有用的链接:forums.codecharge.com/posts.php?post_id=57257
              • Thanx Gordon 为您提供帮助...我实际上正在使用 Jasper Reports 生成输出,但我找不到将输出导出到打印机的任何选项...以及默认支持的格式不包括 PS
              【解决方案8】:

              也许这段代码可以提供帮助:

              try
                  {
                      DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
                      String psMimeType = DocFlavor.BYTE_ARRAY.POSTSCRIPT.getMimeType();
                      StreamPrintServiceFactory[] factories = StreamPrintServiceFactory.lookupStreamPrintServiceFactories(flavor, psMimeType);
              
                      System.out.println ("Available PS services: " + factories.length);
              
                      if(factories.length == 0)
                      {
                          System.err.println ("No PS factories available!");
                          System.exit(0);
                      }
              
                      // Open the PDF file
                      PDFPrint pdfPrint = new PDFPrint ("test.pdf", null);
              
                      // Open the output file
                      FileOutputStream fos = new FileOutputStream("output.ps");
              
                      // Use the first service available
                      StreamPrintService sps = factories[0].getPrintService(fos);
                      DocPrintJob pj = sps.createPrintJob();
              
                      // Define paper size
                      PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
                      aset.add(MediaSizeName.NA_LETTER);
              
                      // Create simple doc using PDFPrint as Printable and print it
                      SimpleDoc doc = new SimpleDoc(pdfPrint, flavor, null);
                      pj.print(doc, aset);
              
                      // Close the output PS stream
                      fos.close();
                  }
                  catch (Throwable t)
                  {
                      t.printStackTrace();
                  }
              

              【讨论】:

                猜你喜欢
                • 2011-03-30
                • 2016-11-07
                • 2019-11-24
                • 2012-02-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-27
                • 2016-12-02
                • 1970-01-01
                相关资源
                最近更新 更多