使用 Java 可在 Linux 系统上打印来保存 PDF 文件

Save PDF file using Java Printable on Linux system

我有一个工作 class,它通过实现 Printable 并使用 PrinterJob 将 PDF 创建到设定位置来为用户创建和保存 PDF 文件。这在 Windows 系统上完美运行,但我在 Linux 系统上执行此操作时遇到问题。

我正在尝试在 Linux 系统上自动创建这些 PDF,如下所示:

    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintable( this );
    job.setPrintService( defaultPrinter );
    // create a new HashPrintRequestAttributeSet
    HashPrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
    // set the output file as a destination 
    attributes.add(new Destination(new File(fileName).toURI()));
    job.print(attributes);

我已经在我的 Linux 系统上安装了 cups-pdf 并将 defaultPrinter 指向那个 PrintService。该文件已创建,但它不是 PDF 文件而是 Postscript 文件。 CUPS 甚至没有为此创建打印作业,所以我相信它只是使用打印机命令创建一个 postscript 文件。

Postscript 文件开头如下:

%!PS-Adobe-3.0
%%BeginProlog
/imStr 0 def /imageSrc {currentfile /ASCII85Decode filter /RunLengthDecode filter  imStr readstring pop } def
/BD {bind def} bind def
/D {def} BD
/C {curveto} BD
/L {lineto} BD
/M {moveto} BD
/R {grestore} BD
/G {gsave} BD
/N {newpath} BD
/P {closepath} BD
/EC {eoclip} BD
/WC {clip} BD
/EF {eofill} BD
/WF {fill} BD
/SG {setgray} BD
/SC {setrgbcolor} BD
...

我知道我可以使用 PDFBox 自己绘制 PDF,但所有用于创建 PDF 文件的代码都在那里,而且都适用于 windows。是否可以让 linux 系统创建 PDF 并使用 PrinterJob 将其保存到某个位置?

原来只有 windows 系统需要属性。如果您在 Linux 系统上使用属性,它只会保存打印机命令而不是 PDF。

如果您的 linux 系统上有 lpr 并调用 job.print();,它将以这种方式创建 PDF,为作业命名以便您可以在系统中找到它.

必须安装 cups-pdf 和 cups-bsd。