Как печатать PDF автоматически - PullRequest
4 голосов
/ 03 февраля 2010

У нас есть несколько систем, которые создают PDF-файлы, которые необходимо распечатать. Они хранятся в центральном хранилище документов. Затем сообщение попадает в очередь JMS, которую необходимо распечатать. Сервис, написанный на Java, выбирает их и затем вызывает собственную команду. Это для вызова Adobe Reader с флагом / t. Это приводит к тому, что документ печатается без отображения графического интерфейса.

Однако, так как отключение питания больше не работает. Тем временем нам приходится вручную печатать сотни документов. Первоначально мы пытались использовать печать Java, но PDF-файлы вышли из-под контроля.

Что является лучшим решением для этого?

Ответы [ 5 ]

3 голосов
/ 04 февраля 2010

Этот код работает, только если принтер поддерживает PDF. В противном случае вам нужно использовать собственный принтер или библиотеку Java. Об этом есть статья в блоге http://pdf.jpedal.org/java-pdf-blog/bid/25566/Printing-PDF-files-from-Java

1 голос
/ 20 февраля 2016

Вы можете использовать Apache PDFBox . Примеры:

а) Печать PDF как Pageable

PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob printJob = printService.createPrintJob();

PDDocument pdDocument = PDDocument.load(new File("doc.pdf"));
PDFPageable pdfPageable = new PDFPageable(pdDocument);
SimpleDoc doc = new SimpleDoc(pdfPageable, DocFlavor.SERVICE_FORMATTED.PAGEABLE, null);

printJob.print(doc, null);

б) Печать PDF как Printable

Эта опция имеет то преимущество, что вы можете управлять размерами страницы, полями и т. Д., Изменяя переменную pageFormat.

PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob printJob = printService.createPrintJob();
PageFormat pageFormat = PrinterJob.getPrinterJob().defaultPage();

PDDocument pdDocument = PDDocument.load(new File("doc.pdf"));
PDFPrintable pdfPrintable = new PDFPrintable(pdDocument);

Book book = new Book();
book.append(pdfPrintable, pageFormat);
SimpleDoc doc = new SimpleDoc(book, DocFlavor.SERVICE_FORMATTED.PAGEABLE, null);

printJob.print(doc, null);
1 голос
/ 10 января 2012

Начиная с Java 1.5, Sun разработала библиотеку рендеринга PDF для обработки PDF. Теперь этот оставлен Swing Labs. И не уверен, будет ли он добавлен в будущие API Java. http://java.net/projects/pdf-renderer/

Используется для просмотра или печати файлов PDF. чтобы распечатать PDF-файлы, вы можете вызвать это libray. Вот некоторая часть кода.

File input = new File(docName);
FileInputStream fis = new FileInputStream(input);
FileChannel fc = fis.getChannel();
ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());

PDFFile curFile=null;
PDFPrintPage pages=null;
curFile = new PDFFile(bb); // Create PDF Print Page
pages = new PDFPrintPage(curFile);
PrinterJob pjob = PrinterJob.getPrinterJob();

PrintService[] services = pjob.lookupPrintServices();
for(PrintService ps:services){
    String pName = ps.getName();
    if(pName.equalsIgnoreCase("PrinterName")){
        pjob.setPrintService(ps);
        System.out.println(pName);
        break;
    }
}

pjob.setJobName(docName);
Book book = new Book();
PageFormat pformat = PrinterJob.getPrinterJob().defaultPage();
book.append(pages, pformat, curFile.getNumPages());
pjob.setPageable(book);

// print
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();


// Print it
pjob.print(aset);
1 голос
/ 03 февраля 2010

Попробуйте использовать ICEpdf .Вот пример со страницы документации :

Document pdf = new Document();
pdf.setFile(filePath);

// create a new print helper with a specified paper size and print
// quality
PrintHelper printHelper = new PrintHelper(null, pdf.getPageTree(),
        0f, MediaSizeName.NA_LEGAL, PrintQuality.DRAFT);
// try and print pages 1 - 10, 1 copy, scale to fit paper.
printHelper.setupPrintService(selectedService, 0, 0, 1, true);
// print the document
printHelper.print();
1 голос
/ 03 февраля 2010

Покажите нам код. Я помню печать PDF без проблем с использованием Java Print API. Ниже приведен код, который может нуждаться в некоторой модификации, но он должен работать как есть,

        InputStream in = new FileInputStream(file);
        DocFlavor flavor = DocFlavor.INPUT_STREAM.PDF;

        // find the printing service
        AttributeSet attributeSet = new HashAttributeSet();
        attributeSet.add(new PrinterName("FX", null));
        attributeSet.add(new Copies(1));

        PrintService[] services = PrintServiceLookup.lookupPrintServices(
                DocFlavor.INPUT_STREAM.PDF, attributeSet);

        //create document
        Doc doc = new SimpleDoc(in, flavor, null);

        // create the print job
        PrintService service = services[0];
        DocPrintJob job = service.createPrintJob();

        // monitor print job events
        PrintJobWatcher watcher = new PrintJobWatcher(job);

        System.out.println("Printing...");
        job.print(doc, null);

        // wait for the job to be done
        watcher.waitForDone();
        System.out.println("Job Completed!!");

Примечание:

  • Flavor не требуется в 2 местах, достаточно 1 места. Вы узнаете это.
  • PrintJobWatcher - это вложенный класс, для добавления PrintJobListener.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...