Java PrinterJob,无论怎样,高质量的打印最终都会达到72 DPI
我正在尝试以300 dpi打印质量在1英寸x 2英寸标签上打印图像Java PrinterJob,无论怎样,高质量的打印最终都会达到72 DPI,java,printing,Java,Printing,我正在尝试以300 dpi打印质量在1英寸x 2英寸标签上打印图像 public void print() { RepaintManager currentManager = RepaintManager.currentManager(this); currentManager.setDoubleBufferingEnabled(false); PrinterJob job = PrinterJob.getPrinterJob();
public void print() {
RepaintManager currentManager = RepaintManager.currentManager(this);
currentManager.setDoubleBufferingEnabled(false);
PrinterJob job = PrinterJob.getPrinterJob();
try {
HashPrintRequestAttributeSet set = new HashPrintRequestAttributeSet();
set.add(PrintQuality.HIGH);
set.add(MediaSize.findMedia(2.125f, 1f, MediaSize.INCH));
// 2" x 1" PrintableArea
set.add(new MediaPrintableArea(1f/16f, 0f, 2.0f, 1f, MediaPrintableArea.INCH));
set.add(new PrinterResolution(300, 300, ResolutionSyntax.DPI));
set.add(OrientationRequested.PORTRAIT);
job.setPrintable(this);
job.setJobName("Label");
job.print(set);
} catch (PrinterException e) {
// The job did not complete successfully
e.printStackTrace();
}
currentManager.setDoubleBufferingEnabled(true);
}
我的BuffereImage是300 x 600像素,应该适合
BufferedImage bi = freeze(this); //getting BufferedImage from JPanel
System.out.println("Image dim: "+bi.getWidth()+" X "+bi.getHeight());
控制台输出:图像尺寸:600 X 300
但问题是当我打印出可成像的尺寸时,比如
double x=pf.getImageableX();
double y=pf.getImageableY();
int w = (int)Math.round(pf.getImageableWidth());
int h = (int)Math.round(pf.getImageableHeight());
System.out.println("X: "+x);
System.out.println("Y: "+y);
System.out.println("W: "+w);
System.out.println("H: "+h);
结果是:
X: 4.50141716003418
Y: 0.0
W: 144
H: 72
来自h&w:我这里每英寸有72个像素,任何大小调整都没有效果,这没有意义
HashPrintRequestAttributeSet对300 DPI的请求有什么用处?清楚地说明:
返回页面可成像区域的高度,单位为1/72英寸。此方法考虑了页面的方向
(getImageableWidth()的API文档与之类似。)
当您将可打印区域指定为2x1英寸时(请参见代码中的MediaPrintableArea
属性),可成像宽度和高度分别为144英寸。72英寸(1/72英寸)
方法文档中没有关于DPIs的一个词。多亏了本教程中的“Marty Hall”,魔法才刚刚发生 我所做的是: 1-不要在要打印的同一面板上实现可打印接口 2-使用实用程序类(教程中提到的用于执行此任务) 3-使用一个图形对象绘制所有组件(位置图像),不要堆叠/布局许多组件来绘制面板
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
RenderingHints rh = new RenderingHints(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
rh.put(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2d.setRenderingHints(rh);
// Grids for testing porpose
for(int i=50; i<=300; i+=50) {
g2d.drawLine(i, 0, i, 600);
g2d.drawString(""+i, i-20,20);
}
for(int i=100; i<=400; i+=100) {
g2d.drawLine(0, i, 300, i);
g2d.drawString(""+i, 10,i-10);
}
g2d.translate(0, 400);
BufferedImage barcodeImage=getBarCode128(String.valueOf(1234567));
g2d.drawImage(barcodeImage, 0, 0, 300, 200, null);
}
5-根据需要进行平移和缩放,然后打印面板
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (pageIndex > 0) {
return(NO_SUCH_PAGE);
} else {
Graphics2D g2d = (Graphics2D)g;
g2d.translate(pf.getImageableX(), pf.getImageableY());
g2d.scale(pf.getImageableWidth()/componentToBePrinted.getWidth(), pf.getImageableHeight()/componentToBePrinted.getHeight());
disableDoubleBuffering(componentToBePrinted);
componentToBePrinted.paint(g2d);
enableDoubleBuffering(componentToBePrinted);
return(PAGE_EXISTS);
}
}
谢谢您的回复,但我的问题是“如何将300像素调整为72像素?”是否尝试缩放图形g2d.scale()或GetScaleInstance会获得72 DPI打印分辨率的相同结果,不管我是如何完成这项工作的,但仍然不知道问题在哪里trick@WalidKilany“72 DPI打印分辨率”是什么意思?你怎么知道的?正如我在回答中所述,
getImageableWidth()
不会返回任何与实际打印分辨率相关的内容。除此之外,您还可以将可打印区域设置为1x2英寸。。。
public int print(Graphics g, PageFormat pf, int pageIndex) {
if (pageIndex > 0) {
return(NO_SUCH_PAGE);
} else {
Graphics2D g2d = (Graphics2D)g;
g2d.translate(pf.getImageableX(), pf.getImageableY());
g2d.scale(pf.getImageableWidth()/componentToBePrinted.getWidth(), pf.getImageableHeight()/componentToBePrinted.getHeight());
disableDoubleBuffering(componentToBePrinted);
componentToBePrinted.paint(g2d);
enableDoubleBuffering(componentToBePrinted);
return(PAGE_EXISTS);
}
}