gpt4 book ai didi

java PrinterJob 不打印以适合纸张

转载 作者:行者123 更新时间:2023-11-30 07:05:09 26 4
gpt4 key购买 nike

我目前在使用默认打印机打印 jpeg 文件时卡住了。在我的程序中,当我从文件夹中选择图像时,我需要使用打印机默认设置(纸张尺寸、边距、方向)打印它。

目前我得到了这个:

PrintService printService = PrintServiceLookup.lookupDefaultPrintService();
final BufferedImage image = ImageIO.read(new File("car.jpg"));

PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintService(printService);
printJob.setPrintable(new Printable(){
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException{
if (pageIndex == 0) {
graphics.drawImage(image, 0, 0, (int)pageFormat.getWidth(), (int)pageFormat.getHeight(), null);
return PAGE_EXISTS;
else return NO_SUCH_PAGE;
}
}

printJob.print();

我的打印机现在的默认尺寸设置是:10 x 15 厘米(4 x 6 英寸)但是当我将我的程序设置为打印给定图像时,它只显示纸张的一小部分。

请帮帮我。

编辑

感谢大家的帮助,我设法找到了另一个用户在 Borderless printing 发布的答案

最佳答案

确保您首先将Graphics 上下文转换为适合可想象的区域...

g2d.translate((int) pageFormat.getImageableX(),
(int) pageFormat.getImageableY());

接下来,确保您使用的是 PageFormatimageableWidthimageableHeight

double width = pageFormat.getImageableWidth();
double height = pageFormat.getImageableHeight();

而不是 width/height 属性。其中许多内容都是从不同的上下文翻译而来的...

graphics.drawImage(image, 0, 0, (int)width, (int)height, null);

getImageableWidth/Height 返回页面方向上下文中的页面大小

打印几乎假定 dpi 为 72(不要紧张,打印 API 可以处理更高的分辨率,但核心 API 假定为 72dpi)

这意味着 10x15cm 的页面应转换为 283.46456664x425.19684996 像素。您可以通过使用 System.out.println 并将 getImageableWidth/Height 的结果转储到控制台来验证此信息。

如果您得到不同的设置,可能是 Java 覆盖了默认页面属性

例如……

你有两个选择......

你可以...

显示 PrintDialog 并确保选择了正确的页面设置

PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new PrinterResolution(300, 300, PrinterResolution.DPI));
aset.add(new MediaPrintableArea(0, 0, 150, 100, MediaPrintableArea.MM));

PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPrintable(new PrintTask()); // You Printable here

if (pj.printDialog(aset)) {
try {
pj.print(aset);
} catch (PrinterException ex) {
ex.printStackTrace();
}
}

或者你可以...

只需手动设置纸张/页面值...

public static void main(String[] args) {
PrinterJob pj = PrinterJob.getPrinterJob();
PageFormat pf = pj.defaultPage();
Paper paper = pf.getPaper();
// 10x15mm
double width = cmsToPixel(10, 72);
double height = cmsToPixel(15, 72);
paper.setSize(width, height);
// 10 mm border...
paper.setImageableArea(
cmsToPixel(0.1, 72),
cmsToPixel(0.1, 72),
width - cmsToPixel(0.1, 72),
height - cmsToPixel(0.1, 72));
// Orientation
pf.setOrientation(PageFormat.PORTRAIT);
pf.setPaper(paper);
PageFormat validatePage = pj.validatePage(pf);
pj.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
// Your code here
return NO_SUCH_PAGE;
}

}, validatePage);
try {
pj.print();
} catch (PrinterException ex) {
ex.printStackTrace();
}
}

// The number of CMs per Inch
public static final double CM_PER_INCH = 0.393700787d;
// The number of Inches per CMs
public static final double INCH_PER_CM = 2.545d;
// The number of Inches per mm's
public static final double INCH_PER_MM = 25.45d;

/**
* Converts the given pixels to cm's based on the supplied DPI
*
* @param pixels
* @param dpi
* @return
*/
public static double pixelsToCms(double pixels, double dpi) {
return inchesToCms(pixels / dpi);
}

/**
* Converts the given cm's to pixels based on the supplied DPI
*
* @param cms
* @param dpi
* @return
*/
public static double cmsToPixel(double cms, double dpi) {
return cmToInches(cms) * dpi;
}

/**
* Converts the given cm's to inches
*
* @param cms
* @return
*/
public static double cmToInches(double cms) {
return cms * CM_PER_INCH;
}

/**
* Converts the given inches to cm's
*
* @param inch
* @return
*/
public static double inchesToCms(double inch) {
return inch * INCH_PER_CM;
}

关于java PrinterJob 不打印以适合纸张,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27029166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com