Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打印java代码不会发生任何事情_Java_Printing - Fatal编程技术网

打印java代码不会发生任何事情

打印java代码不会发生任何事情,java,printing,Java,Printing,大家好,我有下面的代码,它符合刚刚好,没有错误,但它不做任何事情,它的意思是打印出一页说 你好,世界 祝你今天愉快 但什么都没发生,我做错了什么 代码: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ /** * * @author Richard */ import java.io.*; import javax.print.*; im

大家好,我有下面的代码,它符合刚刚好,没有错误,但它不做任何事情,它的意思是打印出一页说

你好,世界 祝你今天愉快

但什么都没发生,我做错了什么

代码:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Richard
 */
import java.io.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import javax.print.event.*;

public class printtest {
    public static void main(String[] args) {
        try {
            // Open the image file

            String testData = "hello world \r\n have a nice day.";
            InputStream is = new ByteArrayInputStream(testData.getBytes());
            DocFlavor flavor =  DocFlavor.INPUT_STREAM.AUTOSENSE   ;


            //DocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN;     
            //DocFlavor flavor = DocFlavor.CHAR_ARRAY.TEXT_PLAIN;

            // Find the default service

            PrintService service = PrintServiceLookup.lookupDefaultPrintService();
            System.out.println(service);

            // Create the print job
            DocPrintJob job = service.createPrintJob();
            Doc doc= new SimpleDoc(is, flavor, null);

            PrintJobWatcher pjDone = new PrintJobWatcher(job);

            // Print it
            job.print(doc, null);

            pjDone.waitForDone();

            // It is now safe to close the input stream
            is.close();


        } catch (PrintException e) {
            System.out.println("print exception");
            System.out.println(e.getMessage());
        } catch (IOException e) {
            System.out.println("IO exception");
            e.printStackTrace();
        }

    }

    static class PrintJobWatcher {
        // true iff it is safe to close the print job's input stream
        boolean done = false;

        PrintJobWatcher(DocPrintJob job) {
            // Add a listener to the print job
            job.addPrintJobListener(new PrintJobAdapter() {
                public void printJobCanceled(PrintJobEvent pje) {
                    allDone();
                }
                public void printJobCompleted(PrintJobEvent pje) {
                    allDone();
                }
                public void printJobFailed(PrintJobEvent pje) {
                    allDone();
                }
                public void printJobNoMoreEvents(PrintJobEvent pje) {
                    allDone();
                }
                void allDone() {
                    synchronized (PrintJobWatcher.this) {
                        done = true;
                        PrintJobWatcher.this.notify();
                    }
                }
            });
        }
        public synchronized void waitForDone() {
            try {
                while (!done) {
                    wait();
                }
            } catch (InterruptedException e) {
            }
        }
    }

}
我刚做完 void main(字符串[]args) printest.main({})

它会出现一个窗口,显示:

Win32打印机:HP988FD1(HP Officejet Pro 8600)

然后什么也不做,作业在队列中出现了一瞬间,但什么也没有发生,重新安装了打印机的驱动程序等,仍然没有运气,工作正常,下面的代码我已经运行并成功打印了一个页面:

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.text.*;
/**
* The PrintText application expands on the
* PrintExample application in that it images
* text on to the single page printed.
*/
public class PrintText implements Printable {
/**
* The text to be printed.
*/
private static final String mText = 
"Four score and seven years ago our fathers brought forth on this "
+ "continent a new nation, conceived in liberty and dedicated to the "
+ "proposition that all men are created equal. Now we are engaged in "
+ "a great civil war, testing whether that nation or any nation so "
+ "conceived and so dedicated can long endure. We are met on a great "
+ "battlefield of that war. We have come to dedicate a portion of "
+ "that field as a final resting-place for those who here gave their "
+ "lives that that nation might live. It is altogether fitting and "
+ "proper that we should do this. But in a larger sense, we cannot "
+ "dedicate, we cannot consecrate, we cannot hallow this ground." 
+ "The brave men, living and dead who struggled here have consecrated "
+ "it far above our poor power to add or detract. The world will "
+ "little note nor long remember what we say here, but it can never "
+ "forget what they did here. It is for us the living rather to be "
+ "dedicated here to the unfinished work which they who fought here "
+ "have thus far so nobly advanced. It is rather for us to be here "
+ "dedicated to the great task remaining before us--that from these "
+ "honored dead we take increased devotion to that cause for which "
+ "they gave the last full measure of devotion--that we here highly "
+ "resolve that these dead shall not have died in vain, that this "
+ "nation under God shall have a new birth of freedom, and that "
+ "government of the people, by the people, for the people shall "
+ "not perish from the earth.";
/**
* Our text in a form for which we can obtain a
* AttributedCharacterIterator.
*/
private static final AttributedString mStyledText = new AttributedString(mText);
/**
* Print a single page containing some sample text.
*/
static public void main(String args[]) {
/* Get the representation of the current printer and 
* the current print job.
*/
PrinterJob printerJob = PrinterJob.getPrinterJob();
/* Build a book containing pairs of page painters (Printables)
* and PageFormats. This example has a single page containing
* text.
*/
Book book = new Book();
book.append(new PrintText(), new PageFormat());
/* Set the object to be printed (the Book) into the PrinterJob.
* Doing this before bringing up the print dialog allows the
* print dialog to correctly display the page range to be printed
* and to dissallow any print settings not appropriate for the
* pages to be printed.
*/
printerJob.setPageable(book);
/* Show the print dialog to the user. This is an optional step
* and need not be done if the application wants to perform
* 'quiet' printing. If the user cancels the print dialog then false
* is returned. If true is returned we go ahead and print.
*/
boolean doPrint = printerJob.printDialog();
if (doPrint) {
try {
printerJob.print();
} catch (PrinterException exception) {
System.err.println("Printing error: " + exception);
}
}
}
/**
* Print a page of text.
*/
public int print(Graphics g, PageFormat format, int pageIndex) {
/* We'll assume that Jav2D is available.
*/
Graphics2D g2d = (Graphics2D) g;
/* Move the origin from the corner of the Paper to the corner
* of the imageable area.
*/
g2d.translate(format.getImageableX(), format.getImageableY());
/* Set the text color.
*/
g2d.setPaint(Color.black);
/* Use a LineBreakMeasurer instance to break our text into
* lines that fit the imageable area of the page.
*/
Point2D.Float pen = new Point2D.Float();
AttributedCharacterIterator charIterator = mStyledText.getIterator();
LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d.getFontRenderContext());
float wrappingWidth = (float) format.getImageableWidth();
while (measurer.getPosition() < charIterator.getEndIndex()) {
TextLayout layout = measurer.nextLayout(wrappingWidth);
pen.y += layout.getAscent();
float dx = layout.isLeftToRight()? 0 : (wrappingWidth - layout.getAdvance());
layout.draw(g2d, pen.x + dx, pen.y);
pen.y += layout.getDescent() + layout.getLeading();
}
return Printable.PAGE_EXISTS;
}
}
import java.awt.*;
导入java.awt.font.*;
导入java.awt.geom.*;
导入java.awt.print.*;
导入java.text.*;
/**
*PrintText应用程序将在
*打印示例应用程序中的图像
*打印到单页上的文本。
*/
公共类PrintText实现了可打印的{
/**
*要打印的文本。
*/
私有静态最终字符串多行文字=
“八十七年前,我们的父辈在这方面创造了奇迹”
+非洲大陆一个新的国家,孕育于自由之中,献身于祖国
+“人人生而平等的主张。现在我们正在从事”
+一场伟大的内战,考验着这个国家或任何一个国家
+“我们怀着这样的想法和奉献精神,能够长久存在。我们在一个伟大的世界上相遇”
+“那场战争的战场。我们来这里是为了奉献一部分”
+“这片土地是这里献身者的最后安息之地”
+“为了那个国家的生存而活着。这完全是合适的”
+“我们应该这样做是正确的。但从更广泛的意义上说,我们不能”
+“奉献,我们不能使这片土地神圣化。”
+“在这里战斗过的勇士们,无论是活着的还是死去的,都已成为圣洁”
+“这远远超出了我们可怜的力量所能增减的范围。世界将”
+“小纸条也记不住我们在这里说的话,但永远记不住”
+“忘了他们在这里做的事吧,这是为了我们活着的人”
+“在这里献身于他们在这里战斗的未完成的工作”
+“到目前为止,我们取得了如此崇高的进步。我们来到这里倒是更好的选择”
+“致力于摆在我们面前的伟大任务——来自这些”
+“尊敬的死者,我们更加献身于我们的事业”
+“他们付出了最后的全部奉献——我们在这里高度赞扬”
+“决定这些死者不会白白死去
+上帝保佑下的国家将迎来自由的新生
+民有、民治、民享的政府
+“不会从地球上消失。”;
/**
*我们的文本的形式,我们可以获得
*属性特征符。
*/
私有静态最终AttributeString mStyledText=新AttributeString(多行文字);
/**
*打印包含一些示例文本的单个页面。
*/
静态公共void main(字符串参数[]){
/*获取当前打印机和打印机的表示形式
*当前打印作业。
*/
PrinterJob PrinterJob=PrinterJob.getPrinterJob();
/*创建一本包含成对页面绘制者的书(可打印)
*和页面格式。此示例有一个包含
*文本。
*/
书=新书();
book.append(新的PrintText(),新的PageFormat());
/*将要打印的对象(书本)设置为PrinterJob。
*在打开“打印”对话框之前执行此操作将允许
*“打印”对话框以正确显示要打印的页面范围
*以及不允许任何不适合的打印设置
*要打印的页面。
*/
printerJob.setPageable(书本);
/*向用户显示打印对话框。这是可选步骤
*如果应用程序想要执行,则不需要执行
*“安静”打印。如果用户取消打印对话框,则为false
*返回。如果返回true,则继续打印。
*/
布尔doPrint=printerJob.printDialog();
if(doPrint){
试一试{
printerJob.print();
}捕获(PrinterException异常){
System.err.println(“打印错误:+异常”);
}
}
}
/**
*打印一页文本。
*/
公共整型打印(图形g、页面格式、整型页面索引){
/*我们假设Jav2D是可用的。
*/
Graphics2D g2d=(Graphics2D)g;
/*将原点从纸张的一角移动到另一角
*可成像区域的面积。
*/
translate(format.getImageableX(),format.getImageableY());
/*设置文本颜色。
*/
g2d.setPaint(颜色:黑色);
/*使用LineBreakMeasurer实例将文本拆分为
*适合页面可成像区域的行。
*/
Point2D.Float pen=新的Point2D.Float();
AttributedCharacterIterator charIterator=mStyledText.getIterator();
LineBreakMeasurer measurer=新的LineBreakMeasurer(charIterator,g2d.getFontRenderContext());
float wrappingWidth=(float)format.getImageableWidth();
while(measurer.getPosition()
在完成打印作业之前,
PrintService
API可能正在等待
InputStream
关闭


删除
pjDone.waitForDone()
看看会发生什么(这对我来说很好)

我遇到了类似的问题,但打印的是PDF,而不是基本文本。它在Linux(Fedora)上运行良好,但在Windows上运行不好。因此,如果它可以帮助任何人,以下是我的解决方案:

我注意到打印机可能无法处理PDF。我最终决定使用第三方lib,它工作得很好


如果有帮助的话,我在回答类似问题时写了一些示例代码。

这一行
System.out.println(服务)不起作用,因为服务没有有用的toString()方法。您可以使用
service.getName()
打印出服务名称,但对打印作业文本的调试访问权限有点小