当前位置: 首页 > 面试题库 >

java PrinterJob无法打印以适合纸张

上官英哲
2023-03-14
问题内容

我目前在使用默认打印机打印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英寸),但是当我将程序设置为打印给定图像时,它仅显示一小部分纸张。

请帮帮我。


问题答案:

首先,请确保您将Graphics上下文翻译成适合可成像的区域…

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

接下来,请确保您使用的是imageableWidthimageableHeightPageFormat

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;
}


 类似资料:
  • 我使用PdfiumViewer来打印PDF文件: 在我的,,和事件中,我没有执行任何操作,只是对文件进行一些日志。 PDF文件已打印,但文档每页的左右边距都被剪掉了,因此我正在尝试将每个PDF文档页面与默认打印机中当前默认选择的纸张尺寸相匹配。我该怎么做?

  • 问题内容: 我需要用Java打印图像。因此我实现了接口方法。但是打印机始终只打印一些原始图像。如何使图像适合打印区域(A4),以便打印机能够打印整个图像,而不是整个图像?现在我的代码如下: 问题答案: 您需要按比例缩小图像以适合可用区域。

  • 我正在尝试获取mongodb中存在的所有数据库的值,迭代所有数据库和集合,然后打印it文档。我可以打印作为变量传递集合的文档,但不能在所有数据库和集合上进行迭代(作为变量的值)。有人知道pymongo是否支持动态地作为值传递,而不是将集合和数据库作为变量本身传递?

  • 我正在使用适用于Android的兄弟打印SDK。我的代码基于手册中所示的示例代码: } 当打印机的盖子打开时,flushPTTPrint()函数会立即返回,状态为ERROR\u cover\u open。这太棒了。 当打印机没有纸时,flushPTTPrint()函数仅在大约三分钟后返回,状态为ERROR_COMMUNICATION_ERROR。不太好。 问题:如何检测打印机何时缺纸?任何方法都可

  • 我使用的是爱普生lx 300 II点阵打印机,我使用的是半信纸大小的纸张(拖拉机进纸),并且我已将自定义纸张大小设置为宽8.5英寸,高5.5英寸。 当我打印一页时,它打印得很好,但如果打印多页,第一页打印的很好,而对于其他页面,半个字母的大小没有继续(顶部有3/4空行,因此底部的文本打印在下一页的顶部)。我正在使用adobe阅读器打印从jasper报告导出的pdf文档,操作系统是windows7。

  • 我尝试在A4纸上以横向打印JavaFX WebView (JavaFX 8_25)中的HTML页面,但它以纵向打印出来,字体很小 系统输出显示纵向方向 纸张=纸:A4 (210 x 297mm) 尺寸=594.90087890625x841.3598022460938 MM 东方=纵向左边缘=54.0 右边缘=54.0 顶部边缘=54.0 底部边缘=54.0 我发现以横向模式打印HTML页面的唯一