Конвертировать из PDF в Postscript, используя Java - PullRequest
6 голосов
/ 15 января 2010

У меня есть приложение на основе J2EE, где я использую инструмент отчетности для создания выходных данных в формате PDF. Мне нужна утилита / инструмент в Java, которая может помочь мне преобразовать мой PDF-файл в формат postscript, чтобы я мог распечатать его на принтере ... Поэтому мое приложение будет работать на различных ОС (например, Windows / Linux / AIX) решение, независимое от платформы, необходимо. Мой инструмент отчетности не поддерживает вывод в формате PS. Пожалуйста, совет ...

Ответы [ 7 ]

4 голосов
/ 15 января 2010

AFAIK для этого не существует надежных чистых Java-решений, но если преобразование будет выполняться на стороне сервера, я бы рекомендовал вам использовать Ghostscript pdf2ps конвертер. Даже если вам нужно установить версию Ghostscript для конкретной платформы, вы должны найти ее для всех упомянутых платформ.

1 голос
/ 10 февраля 2018

Вот мое чистое решение 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'
}
0 голосов
/ 23 мая 2013

Использование 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>
0 голосов
/ 06 февраля 2013

Может быть, этот код может помочь:

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();
    }
0 голосов
/ 26 января 2010

Другое решение, основанное на exe, например Ghostscript, - Xpdf.PdfToPS
PdfToPs - это приложение для командной строки. Работает на Win, Linux и Solaris.
http://www.foolabs.com/xpdf/

0 голосов
/ 16 января 2010

Существует несколько библиотек PDF, которые могут печатать файлы PDF. Если вы печатаете на принтере Postscript и используете опцию печати в файл, вы можете получить Postscript.

0 голосов
/ 15 января 2010

Возможно рассмотрите возможность использования отчетов о яшме .

Это позволит вам создавать отчеты в различных выходных данных (PDF, Html, RTF).

Вы также можете экспортировать отчет на принтер.

Edit:

Вот быстрый пример Я обнаружил, что для экспорта на принтер используется JRPrintServiceExporter , а не экспортер PDF. Похоже, что это сделает работу.

...