Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / PrinterJob получить статус текущей работы / 12 сообщений из 12, страница 1 из 1
14.11.2014, 08:51
    #38805721
whizzzkey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
Добрый день, Господа, возникла такая проблема. Мне необходимо распечатывать 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
14.11.2014, 09:46
    #38805772
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
whizzzkeyНо я не могу использовать DocPrintJob к сожалению
Почему?
...
Рейтинг: 0 / 0
14.11.2014, 09:53
    #38805785
whizzzkey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
Blazkowicz,
Потому что DocPrintJob не печатает PDF файлы, несмотря на то что в нём такая возможность предполагается. После несколько часов гугления я наткнулся на то что Java не имеет встроенного PDF-рендерера, поэтому DocPrintJob не может печатать PDF и падает с эксепшеном.
...
Рейтинг: 0 / 0
14.11.2014, 10:13
    #38805823
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
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
17.11.2014, 02:32
    #38807743
whizzzkey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
Blazkowicz,
К сожалению ваш пример у меня не работает, принтер PDF документ не печатает, вместо этого выдает белые листы. По вашему примеру в очередь печати задание попадает почему то всегда с 1 страницей.
...
Рейтинг: 0 / 0
17.11.2014, 02:43
    #38807746
whizzzkey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
P.S. причем при печати по вашему примеру на первом листе печатаются машинные символы
...
Рейтинг: 0 / 0
18.11.2014, 07:12
    #38809016
whizzzkey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
Ни у кого идей больше нет никаких?
...
Рейтинг: 0 / 0
18.11.2014, 07:57
    #38809032
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
whizzzkey,
У операционки собственная очередь печати. Не?
...
Рейтинг: 0 / 0
18.11.2014, 08:05
    #38809036
whizzzkey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
Petro123,
Обычная виндовая очередь печати
...
Рейтинг: 0 / 0
18.11.2014, 08:20
    #38809042
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
whizzzkey,
Ну да. Есть и принтеры с оперативкой. Это вообще админов дело.
...В линуксе не знаю про пул печати.
...
Рейтинг: 0 / 0
18.11.2014, 08:58
    #38809057
whizzzkey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
Petro123whizzzkey,
Ну да. Есть и принтеры с оперативкой. Это вообще админов дело.
...В линуксе не знаю про пул печати.
Ну так речь не про линукс, а про винду. Я уже что только не пробовал, никак до статуса работы через PrinterJob добраться не могу, пробовал через PrintServiceAttribute, но почему то всегда нужный мне аттрибут PrinterState всегда null (myPrintService.getAttribute(PrinterState.class)) какой бы принтер я бы не выбирал
...
Рейтинг: 0 / 0
18.11.2014, 09:39
    #38809089
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PrinterJob получить статус текущей работы
whizzzkey,
- у винды невозможно очередь забить так, что оперативка кончилась = забить?
- у винды можно через API винды получить досту к очереди
?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / PrinterJob получить статус текущей работы / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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