我正在使用基于J2EE的应用程序,我使用报告工具生成PDF格式的输出。我需要一个Java实用程序/工具,可以帮助我将PDF文件转换为postscript格式,以便我可以将其打印到打印机......我的应用程序将在各种操作系统(即Windows / Linux / AIX)上运行平台独立解决方案至关重要。我的报告工具不支持PS格式的输出。请建议......
答案 0 :(得分:4)
AFAIK没有针对此的纯Java解决方案,但如果要在服务器端完成转换,我建议您使用Ghostscript's pdf2ps转换器。即使您必须安装特定于平台的Ghostscript版本,您也应该找到所有提到的平台。
答案 1 :(得分:1)
这是我的纯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'
}
答案 2 :(得分:0)
有几个PDF库可以打印PDF。如果您打印到Postscript打印机并使用打印到文件选项,您最终可能会使用Postscript。
答案 3 :(得分:0)
另一个解决方案“基于exe”,如Ghostscript,是Xpdf.PdfToPS
PdfToPs是一个纯命令行应用程序。在Win,Linux和Solaris上运行
http://www.foolabs.com/xpdf/
答案 4 :(得分:0)
使用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>
答案 5 :(得分:0)
谢谢,我已经尝试过此选项,并且能够将pdf转换为后记。我面临的唯一问题是,当我将此类文件发送到打印机时,如果pdf具有混合方向(例如某些页面为纵向页面而某些页面为横向页面),则转换后的脚本文件将以纵向或横向模式打印。打印时应自动处理方向。
用于打印ps文件的代码段-
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();
}
答案 6 :(得分:-1)
也许考虑使用jasper reports。
它允许您生成各种输出(PDF,Html,RTF)的报告。
您也可以将报告导出到打印机。
修改强>
以下是我发现使用example导出到打印机的快速JRPrintServiceExporter,而不是使用PDF导出器。看起来它会起作用。
答案 7 :(得分:-1)
也许这段代码可以提供帮助:
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();
}