سؤال

هل هناك أي طريقة في جافا للطباعة إلى طابعة IPP معينة؟ كل من نموذج التعليمات البرمجية والبرامج التعليمية التي وجدتها على كيفية طباعة نوع معين من المستند، باستخدام شيء مثل ما يلي:

DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_A4);
PrintService[] pservices =
             PrintServiceLookup.lookupPrintServices(flavor, aset);
if (pservices.length > 0) {
    DocPrintJob pj = pservices[0].createPrintJob();
    try {
        FileInputStream fis = new FileInputStream("test.ps");
        Doc doc = new SimpleDoc(fis, flavor, null);
        pj.print(doc, aset);
    } catch (FileNotFoundException fe) {
    } catch (PrintException e) { 
    }
}

تتم طباعة هذه المقتطفات ببساطة إلى الطابعة الأولى الموجودة قادرة على طباعة المستند. في حالتي، أريد البحث عن طابعة من قبل URI، ولكن PrintServiceLookup لا يبدو أن يدعم هذا. لقد حاولت استخدام PrintServiceAttributeSet, ، بدلا من PrintRequestAttributeSet, ، وإضافة PrinterURI السمة، ولكن هذا لا يرجع أي طابعات. أظن أن خدمة البحث تبحث عن طابعة يمكنها تغيير uri وجهتها، بدلا من البحث عن الطابعة مع هذا URI.

كملاذ أخير، فكرت في تعداد فقط من خلال كل من PrintServiceعاد من قبل lookupPrintServices, ، ولكن URI ليس في أي من السمات. اسم الطابعة موجود، لكنني أحتاج إلى URI.

بالنسبة للخلفية، يحتاج WebApp الخاص بي إلى طباعة الباركود إلى طابعة محددة، بناء على المستخدم الحالي. يرتبط كل مستخدم بحسم طابعة URI، والذي يشير إلى طابعة على خادم كوب. الطابعة URI هي المعلومات الوحيدة التي لدي، ولا يمكنني تقييد اسم الطابعة لتتناسب مع URI أو Substring of the URI.

يحرر: لتوضيح بعض الشيء، لا أحتاج إلى تقديم البيانات، أحتاج فقط إلى نسخ النقطة إلى طابعة معينة. الجزء لا أستطيع معرفة كيفية تحديد طابعة بواسطة IPP URI الخاص به.

هل كانت مفيدة؟

المحلول

أخيرا وجدت طريقة للقيام بذلك، باستخدام jipsi:

URI printerURI = new URI("ipp://SERVER:631/printers/PRINTER_NAME");
IppPrintService svc = new IppPrintService(printerURI);
InputStream stream = new BufferedInputStream(new FileInputStream("image.epl"));
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc myDoc = new SimpleDoc(stream, flavor, null);
DocPrintJob job = svc.createPrintJob();
job.print(myDoc, null);

يجب أن أعترف أنني بخيبة أمل عند الاضطرار إلى استخدام مكتبة ثلاثية المستوى للقيام بشيء بسيط للغاية مثل الطباعة إلى طابعة محددة.

تحديث

يشير الدكتور في تعليقات أن جيبسي لديه جديد الصفحة الرئيسية, واسم جديد.

cups4j. هو بديل جميل، ولكن كما يعني الاسم أنه قد لا يعمل بشكل صحيح إذا كانت الوجهة ليست خادم كوب. لقد حصلت على نتائج جيدة باستخدام cups4j للطباعة مباشرة إلى طابعة حرارية حمار وحشي.

نصائح أخرى

لا أعتقد أنه يمكنك الحصول على طابعة بالطريقة التي تريدها (أعتقد أن آلية طباعة Java تسببت IPP).

ومع ذلك، قد تكون، إذا كنت أتذكر بشكل صحيح أن أكون قادرا على تقديم مهمة الطباعة الخاصة بك محليا ثم شحن البايتات من دفق الإخراج إلى خادم الكؤوس المستهدف "باليد". هل سيكون هذا "جيدا بما فيه الكفاية" بالنسبة لك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top