我正在尝试以300 dpi的打印质量在1英寸x 2英寸的标签上打印图像
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);
}
我的BufferedImage是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像素,任何调整大小都没有效果,这没有意义,
300 DPI的HashPrintRequestAttributeSet请求有什么用?
API docs of PageFormat#getImageableHeight()
清楚地说:
返回页面可成像区域的高度,以1/72英寸为单位。此方法考虑了页面的方向。
([PageFormat#getImageableHeight()
的API文档相似。]
当您将可打印区域指定为2x1英寸(请参见代码中的getImageableWidth()
属性)时,可成像宽度和高度分别为144和144。 72(1/72英寸)。
方法文档中没有关于DPI的任何单词。
[魔术刚发生了,这要感谢“ Marty Hall”提供的本教程MediaPrintableArea
我所做的是:
1-不在您要打印的同一面板上实现可打印界面2-使用实用程序类(本教程中提到的完成工作)3-使用一个图形对象绘制所有组件(位置图像),不要堆叠/布局许多组件以绘制面板
"Printing Swing Components in Java 1.2"
4-将HashPrintRequestAttributeSet添加到print()方法,因为“ Marty Hall”类使用printDialog()来做到这一点,不适用于我]
@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 void print() {
PrinterJob printJob = PrinterJob.getPrinterJob();
HashPrintRequestAttributeSet set = new HashPrintRequestAttributeSet();
set.add(PrintQuality.HIGH);
set.add(MediaSize.findMedia(1f, 2.125f, MediaSize.INCH));
set.add(new MediaPrintableArea(0f, 1f/16f, 1f, 2.0f, MediaPrintableArea.INCH));
set.add(new PrinterResolution(300, 300, ResolutionSyntax.DPI));
set.add(OrientationRequested.PORTRAIT);
printJob.setPrintable(this);
try {
printJob.print(set);
} catch(PrinterException pe) {
System.out.println("Error printing: " + pe);
}
}
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);
}
}