powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / PrinterJob получить статус текущей работы
12 сообщений из 12, страница 1 из 1
PrinterJob получить статус текущей работы
    #38805721
whizzzkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, Господа, возникла такая проблема. Мне необходимо распечатывать PDF документы, по циклу, перебирая файлы в директории. Файлов очень много и весят они солидно поэтому логично в целях экономии оперативной памяти и дискового пространства сделать так чтобы в очередь печати они помещались не сразу, а друг за другом -> 1ый файл загрузился(поставился в очередь), освободил ресурсы, начинает печататься - 2ой помещается в очередь итд. Так вот для печати PDF я использую библиотеку PDFrenderer , отправляю на печать таким вот образом:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
   File f = new File("мой_файл.pdf");
   FileInputStream fis = new FileInputStream(f);
   FileChannel fc = fis.getChannel();
   ByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
   PDFFile pdfFile = new PDFFile(bb);
   PDFPrintPage pages = new PDFPrintPage(pdfFile);
   PrinterJob pjob = PrinterJob.getPrinterJob();
   PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
   pjob.setJobName(f.getName());
   pjob.setPrintService(mPrintService);
   Book book = new Book();
   book.append(pages, pf, pdfFile.getNumPages());
   pjob.setPageable(book);
   PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
   pjob.print(aset);



Все печатает отлично, НО! мне необходимо каким то образом отслеживать JobStatus моего PrinterJob. Я знаю что Java API имеет прекрасное решение - использовать DocPrintJob и PrintJobListener, с помощью чего можно узнать всё что мне требуется. Но я не могу использовать DocPrintJob к сожалению, поэтому хотел бы узнать каким образом можно узнать статус моего PrinterJob'а?
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38805772
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whizzzkeyНо я не могу использовать DocPrintJob к сожалению
Почему?
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38805785
whizzzkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
Потому что DocPrintJob не печатает PDF файлы, несмотря на то что в нём такая возможность предполагается. После несколько часов гугления я наткнулся на то что Java не имеет встроенного PDF-рендерера, поэтому DocPrintJob не может печатать PDF и падает с эксепшеном.
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38805823
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whizzzkey,

Java 8. Фсё работает. Может вы JavaDoc где-то недочитали.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import javax.print.event.PrintJobAdapter;
import javax.print.event.PrintJobEvent;
import javax.swing.*;
import java.io.*;

/**
 * Created by rostislav on 11/14/2014.
 */
public class Test {
    public static void main(String[] args) throws  Exception{
        FileInputStream psStream;
        psStream = new FileInputStream("printable.pdf");

        DocFlavor psInFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;
        Doc myDoc = new SimpleDoc(psStream, psInFormat, null);
        PrintRequestAttributeSet aset =
                new HashPrintRequestAttributeSet();
        PrintService[] services =
                PrintServiceLookup.lookupPrintServices(psInFormat, aset);
        for (PrintService service : services) {
            if(service.getName().contains("My Favorite Printer")){
                DocPrintJob job = service.createPrintJob();
                job.addPrintJobListener(new PrintJobAdapter() {
                    @Override
                    public void printDataTransferCompleted(PrintJobEvent pje) {
                        System.out.println("TRANSFER COMPLETED");
                    }

                    @Override
                    public void printJobCanceled(PrintJobEvent pje) {
                        System.out.println("CANCELED");
                    }

                    @Override
                    public void printJobRequiresAttention(PrintJobEvent pje) {
                        System.out.println("ATTENTION REQUIRED");
                    }

                    @Override
                    public void printJobFailed(PrintJobEvent pje) {
                        System.out.println("FAILED");
                    }

                    @Override
                    public void printJobNoMoreEvents(PrintJobEvent pje) {
                        System.out.println("COMPLETED, BUT NOT CONFIRMED");
                    }

                    @Override
                    public void printJobCompleted(PrintJobEvent pje) {
                        System.out.println("COMPLETED");
                    }
                });
                job.print(myDoc, aset);
            }
        }
        new JFrame().setVisible(true);
    }
}
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38807743
whizzzkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
К сожалению ваш пример у меня не работает, принтер PDF документ не печатает, вместо этого выдает белые листы. По вашему примеру в очередь печати задание попадает почему то всегда с 1 страницей.
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38807746
whizzzkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.S. причем при печати по вашему примеру на первом листе печатаются машинные символы
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38809016
whizzzkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ни у кого идей больше нет никаких?
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38809032
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whizzzkey,
У операционки собственная очередь печати. Не?
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38809036
whizzzkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,
Обычная виндовая очередь печати
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38809042
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whizzzkey,
Ну да. Есть и принтеры с оперативкой. Это вообще админов дело.
...В линуксе не знаю про пул печати.
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38809057
whizzzkey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123whizzzkey,
Ну да. Есть и принтеры с оперативкой. Это вообще админов дело.
...В линуксе не знаю про пул печати.
Ну так речь не про линукс, а про винду. Я уже что только не пробовал, никак до статуса работы через PrinterJob добраться не могу, пробовал через PrintServiceAttribute, но почему то всегда нужный мне аттрибут PrinterState всегда null (myPrintService.getAttribute(PrinterState.class)) какой бы принтер я бы не выбирал
...
Рейтинг: 0 / 0
PrinterJob получить статус текущей работы
    #38809089
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whizzzkey,
- у винды невозможно очередь забить так, что оперативка кончилась = забить?
- у винды можно через API винды получить досту к очереди
?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / PrinterJob получить статус текущей работы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]