我正在尝试编写一个照相机程序,但我很难做出无边框打印。我很近,但图像没有填充4“x 6”打印。我很感激有关实现无边框打印的任何提示。
干杯!
final BufferedImage img = ImageIO.read(new File(image));
// Assuming that images are going to be 300 DPI
PrinterResolution pr = new PrinterResolution(300, 300,
PrinterResolution.DPI);
PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();
pras.add(pr);
// Set print job so the image name shows (in the print queue)
this.pj.setJobName(new File(image).getName());
PageFormat pf = this.pj.getPageFormat(null);
Paper paper = pf.getPaper();
paper.setSize(4 * 72, 6 * 72);
paper.setImageableArea(
0.0, 0.0,
paper.getWidth(), paper.getHeight()
);
if(img.getWidth(null) > img.getHeight(null))
pf.setOrientation(PageFormat.LANDSCAPE);
else
pf.setOrientation(PageFormat.PORTRAIT);
pf.setPaper(paper);
// Create the page
this.pj.setPrintable(new Printable() {
public int print(Graphics g, PageFormat pf, int i) throws
PrinterException {
if (i != 0)
return NO_SUCH_PAGE;
double width = img.getWidth(null);
double height = img.getHeight(null);
double w = Math.floor(pf.getImageableWidth() -
pf.getImageableX()) / (width * 1.0);
double h = Math.floor(pf.getImageableHeight() -
pf.getImageableY()) / (height * 1.0);
double scale = Math.min(w, h);
Graphics2D g2 = (Graphics2D) g;
g2.translate(0, 0);
g2.scale(scale, scale);
g2.drawImage(img, 0, 0, (int)width, (int)height, null);
return PAGE_EXISTS;
}
}, this.pj.validatePage(pf));
// Get number of copies
int nCopies = SetPrintQuantity.getPrintQuantity(new File(image));
// Print
if(nCopies != 0)
for(int i = 0; i < nCopies; i++)
this.pj.print(pras);
System.out.println(nCopies + ((nCopies == 1) ? " copy" : " copies"));
this.pj = PrinterJob
答案 0 :(得分:2)
我一直在与同样的问题作斗争。这是我的解决方案:
确定打印机的实际页面大小:
final PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintService(ps);
final PageFormat pf = printJob.defaultPage();
System.out.println("Printer Page width=" + pf.getWidth() + " height=" + pf.getHeight());
我的HiTi P720L照片打印机带有4&#34; x6&#34;纸它实际上是4.133&#34; x6.147&#34;。
创建并设置一个具有完整页面大小和完整可成像区域的新Paper对象:
final Paper paper = new Paper();
paper.setSize(pageWidth * 72.0f, pageHeight * 72.0f);
paper.setImageableArea(0.0, 0.0, paper.getWidth(), paper.getHeight());
pf.setPaper(paper);
然后是最后的技巧,绘制到范围之外的x / y坐标。在我的情况下,我必须将x坐标缩放10%并将x坐标转换为-55(将其置于负x值)。
printJob.setPrintable(new Printable() {
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
Graphics2D g2 = (Graphics2D) graphics;
final double xScale = 1.1;
final double xTranslate = -55;
final double yScale = 1;
final double yTranslate = 0;
final double widthScale = (pageFormat.getWidth() / image.getWidth()) * xScale;
final double heightScale = (pageFormat.getHeight() / image.getHeight()) * yScale;
System.out.println("Setting scale to " + widthScale + "x" + heightScale);
final AffineTransform at = AffineTransform.getScaleInstance(widthScale, heightScale);
System.out.println("Setting translate to " + xTranslate + "x" + yTranslate);
at.translate(xTranslate, yTranslate);
if (pageIndex != 0) {
return NO_SUCH_PAGE;
}
g2.drawRenderedImage(image, at);
return PAGE_EXISTS;
}
}, pf);