Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在300dpi中强制使用Java打印图形_Java_Api_Graphics_Printing_Resolution - Fatal编程技术网

如何在300dpi中强制使用Java打印图形

如何在300dpi中强制使用Java打印图形,java,api,graphics,printing,resolution,Java,Api,Graphics,Printing,Resolution,当我在谷歌上搜索这个问题时,不知何故java打印API受到了限制,即发送到打印机的所有图片必须以72dpi分辨率打印。我们使用jasper report打印文档,无论我们绘制多大的条形码,条形码阅读器都不会扫描它。。有类似的经历吗?如何解决此问题?您需要通过属性指定打印机分辨率。您还应该知道源分辨率,以便正确转换,例如: PrinterResolution pr = new PrinterResolution(300, 300, PrinterResolution.DPI); 如果图像的元数据

当我在谷歌上搜索这个问题时,不知何故java打印API受到了限制,即发送到打印机的所有图片必须以72dpi分辨率打印。我们使用jasper report打印文档,无论我们绘制多大的条形码,条形码阅读器都不会扫描它。。有类似的经历吗?如何解决此问题?

您需要通过属性指定打印机分辨率。您还应该知道源分辨率,以便正确转换,例如:

PrinterResolution pr = new PrinterResolution(300, 300, PrinterResolution.DPI);

如果图像的元数据中没有先前定义的DPI,Java会将图像的DPI设置为默认的Java 72dpi,因此添加MediaSizeName、PrinterResolution、MediaPrintableArea属性以获得最佳结果是不够的,您还必须在其元数据中添加图像的DPI,如本答案的方法示例所示:

,然后确保在所需的可打印区域打印其余属性,例如:

        DocFlavor myFormat = DocFlavor.INPUT_STREAM.PNG;
        // Build a set of attributes
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();    
        aset.add(MediaSizeName.ISO_A10);  
        aset.add(new MediaPrintableArea(0, 0, 35, 24, MediaPrintableArea.MM));
        aset.add(PrintQuality.HIGH);
        aset.add(new PrinterResolution(203, 203, PrinterResolution.DPI));
        // adding other attributes
        aset.add(OrientationRequested.PORTRAIT);
        aset.add(new Copies(7));
        aset.add(Fidelity.FIDELITY_TRUE);
import java.awt.EventQueue;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageOutputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.ServiceUI;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import static javax.print.attribute.ResolutionSyntax.DPI;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.Fidelity;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.attribute.standard.PrintQuality;
import javax.print.attribute.standard.PrinterResolution;
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;
import javax.print.event.PrintServiceAttributeEvent;



public class PNGPrintingExample {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        EventQueue.invokeLater(() -> {

            try {


                FileInputStream imageFile = null;



                imageFile = new FileInputStream("E:\\1-and-2-1.png");

                BufferedImage input = ImageIO.read(imageFile);
                File output = new File("E:\\To-Be-Printed.png");
                saveGridImage(output,input);

                imageFile = new FileInputStream(output);

                // Set the document type
                DocFlavor myFormat = DocFlavor.INPUT_STREAM.PNG;
                // Build a set of attributes
                PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 

                // setting media size and printing media attributes
                aset.add(MediaSizeName.ISO_A10);  
                aset.add(new MediaPrintableArea(0, 0, 35, 24, MediaPrintableArea.MM));
                aset.add(PrintQuality.HIGH);
                aset.add(new PrinterResolution(203, 203, PrinterResolution.DPI));

                // adding some may be needed attibutes
                aset.add(OrientationRequested.PORTRAIT);
                aset.add(new Copies(7));
                aset.add(Fidelity.FIDELITY_TRUE);

                        DocPrintJob job;
                        Doc myDoc = new SimpleDoc(imageFile, myFormat, null);
                        PrintService[] services =
                                PrintServiceLookup.lookupPrintServices(myFormat, null);
                        PrintService defaultPrintService = PrintServiceLookup
                           .lookupDefaultPrintService();     
                        PrintService selectedPrintService =
                           ServiceUI.printDialog(null, 150, 150,
                           services, defaultPrintService, myFormat, aset);
                        if(selectedPrintService!=null)
                        {
                           System.out.println("selected printer:"
                              +selectedPrintService.getName());

                                    try {

                                        job = selectedPrintService.createPrintJob();
                                        // Create a Doc

                                        PrintJobListener pjlForP = new PrintJobListener() {

                                            public void attributeUpdate(PrintServiceAttributeEvent e){
                                                System.out.println("updated");
                                            }

                                            @Override
                                            public void printJobNoMoreEvents(PrintJobEvent e){
                                                System.out.println("may be sent to "+e.getPrintJob().getPrintService());
                                            }

                                            @Override
                                            public void printDataTransferCompleted(PrintJobEvent pje) {
                                                System.out.println("print Data Transfer Completed");
                                            }

                                            @Override
                                            public void printJobCompleted(PrintJobEvent pje) {
                                                System.out.println("The print job was completed");
                                            }

                                            @Override
                                            public void printJobFailed(PrintJobEvent pje) {
                                                System.out.println("The print job has failed");
                                            }

                                            @Override
                                            public void printJobCanceled(PrintJobEvent pje) {
                                                System.out.println("The print job was cancelled");
                                            }

                                            @Override
                                            public void printJobRequiresAttention(PrintJobEvent pje) {
                                                System.out.println("The print job require attention");
                                            }
                                        };                                        


                                        job.addPrintJobListener(pjlForP);
                                        job.print(myDoc, aset);

                                        imageFile.close();

                                    } catch (PrintException ex) {
                                        Logger.getLogger(BarcodePrintingFromJava.class.getName()).log(Level.SEVERE, null, ex);
                                    }                           


                        }
                        else
                           System.out.println("selection cancelled");                        


            } catch (FileNotFoundException ex) {
                Logger.getLogger(BarcodePrintingFromJava.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(BarcodePrintingFromJava.class.getName()).log(Level.SEVERE, null, ex);
            }
         });



    }


    public static void saveGridImage(File output,BufferedImage gridImage) throws IOException {
       output.delete();

       final String formatName = "png";

       for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName(formatName); iw.hasNext();) {
          ImageWriter writer = iw.next();
          ImageWriteParam writeParam = writer.getDefaultWriteParam();
          ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
          IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
          if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
             continue;
          }

          setDPI(metadata);

          final ImageOutputStream stream = ImageIO.createImageOutputStream(output);
          try {
             writer.setOutput(stream);
             writer.write(metadata, new IIOImage(gridImage, null, metadata), writeParam);
          } finally {
             stream.close();
          }
          break;
       }
    }

    public static void setDPI(IIOMetadata metadata) throws IIOInvalidTreeException {

       // for PNG, it's dots per millimeter
       double dotsPerMilli = 1.0 * DPI / 10 / 2.54;

       IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
       horiz.setAttribute("value", Double.toString(dotsPerMilli));

       IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
       vert.setAttribute("value", Double.toString(dotsPerMilli));

       IIOMetadataNode dim = new IIOMetadataNode("Dimension");
       dim.appendChild(horiz);
       dim.appendChild(vert);

       IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
       root.appendChild(dim);

       metadata.mergeTree("javax_imageio_1.0", root);
    }    

}
有关更完整的示例:

        DocFlavor myFormat = DocFlavor.INPUT_STREAM.PNG;
        // Build a set of attributes
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();    
        aset.add(MediaSizeName.ISO_A10);  
        aset.add(new MediaPrintableArea(0, 0, 35, 24, MediaPrintableArea.MM));
        aset.add(PrintQuality.HIGH);
        aset.add(new PrinterResolution(203, 203, PrinterResolution.DPI));
        // adding other attributes
        aset.add(OrientationRequested.PORTRAIT);
        aset.add(new Copies(7));
        aset.add(Fidelity.FIDELITY_TRUE);
import java.awt.EventQueue;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOInvalidTreeException;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageOutputStream;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.ServiceUI;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import static javax.print.attribute.ResolutionSyntax.DPI;
import javax.print.attribute.standard.Copies;
import javax.print.attribute.standard.Fidelity;
import javax.print.attribute.standard.MediaPrintableArea;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.OrientationRequested;
import javax.print.attribute.standard.PrintQuality;
import javax.print.attribute.standard.PrinterResolution;
import javax.print.event.PrintJobEvent;
import javax.print.event.PrintJobListener;
import javax.print.event.PrintServiceAttributeEvent;



public class PNGPrintingExample {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        EventQueue.invokeLater(() -> {

            try {


                FileInputStream imageFile = null;



                imageFile = new FileInputStream("E:\\1-and-2-1.png");

                BufferedImage input = ImageIO.read(imageFile);
                File output = new File("E:\\To-Be-Printed.png");
                saveGridImage(output,input);

                imageFile = new FileInputStream(output);

                // Set the document type
                DocFlavor myFormat = DocFlavor.INPUT_STREAM.PNG;
                // Build a set of attributes
                PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 

                // setting media size and printing media attributes
                aset.add(MediaSizeName.ISO_A10);  
                aset.add(new MediaPrintableArea(0, 0, 35, 24, MediaPrintableArea.MM));
                aset.add(PrintQuality.HIGH);
                aset.add(new PrinterResolution(203, 203, PrinterResolution.DPI));

                // adding some may be needed attibutes
                aset.add(OrientationRequested.PORTRAIT);
                aset.add(new Copies(7));
                aset.add(Fidelity.FIDELITY_TRUE);

                        DocPrintJob job;
                        Doc myDoc = new SimpleDoc(imageFile, myFormat, null);
                        PrintService[] services =
                                PrintServiceLookup.lookupPrintServices(myFormat, null);
                        PrintService defaultPrintService = PrintServiceLookup
                           .lookupDefaultPrintService();     
                        PrintService selectedPrintService =
                           ServiceUI.printDialog(null, 150, 150,
                           services, defaultPrintService, myFormat, aset);
                        if(selectedPrintService!=null)
                        {
                           System.out.println("selected printer:"
                              +selectedPrintService.getName());

                                    try {

                                        job = selectedPrintService.createPrintJob();
                                        // Create a Doc

                                        PrintJobListener pjlForP = new PrintJobListener() {

                                            public void attributeUpdate(PrintServiceAttributeEvent e){
                                                System.out.println("updated");
                                            }

                                            @Override
                                            public void printJobNoMoreEvents(PrintJobEvent e){
                                                System.out.println("may be sent to "+e.getPrintJob().getPrintService());
                                            }

                                            @Override
                                            public void printDataTransferCompleted(PrintJobEvent pje) {
                                                System.out.println("print Data Transfer Completed");
                                            }

                                            @Override
                                            public void printJobCompleted(PrintJobEvent pje) {
                                                System.out.println("The print job was completed");
                                            }

                                            @Override
                                            public void printJobFailed(PrintJobEvent pje) {
                                                System.out.println("The print job has failed");
                                            }

                                            @Override
                                            public void printJobCanceled(PrintJobEvent pje) {
                                                System.out.println("The print job was cancelled");
                                            }

                                            @Override
                                            public void printJobRequiresAttention(PrintJobEvent pje) {
                                                System.out.println("The print job require attention");
                                            }
                                        };                                        


                                        job.addPrintJobListener(pjlForP);
                                        job.print(myDoc, aset);

                                        imageFile.close();

                                    } catch (PrintException ex) {
                                        Logger.getLogger(BarcodePrintingFromJava.class.getName()).log(Level.SEVERE, null, ex);
                                    }                           


                        }
                        else
                           System.out.println("selection cancelled");                        


            } catch (FileNotFoundException ex) {
                Logger.getLogger(BarcodePrintingFromJava.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(BarcodePrintingFromJava.class.getName()).log(Level.SEVERE, null, ex);
            }
         });



    }


    public static void saveGridImage(File output,BufferedImage gridImage) throws IOException {
       output.delete();

       final String formatName = "png";

       for (Iterator<ImageWriter> iw = ImageIO.getImageWritersByFormatName(formatName); iw.hasNext();) {
          ImageWriter writer = iw.next();
          ImageWriteParam writeParam = writer.getDefaultWriteParam();
          ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);
          IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam);
          if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) {
             continue;
          }

          setDPI(metadata);

          final ImageOutputStream stream = ImageIO.createImageOutputStream(output);
          try {
             writer.setOutput(stream);
             writer.write(metadata, new IIOImage(gridImage, null, metadata), writeParam);
          } finally {
             stream.close();
          }
          break;
       }
    }

    public static void setDPI(IIOMetadata metadata) throws IIOInvalidTreeException {

       // for PNG, it's dots per millimeter
       double dotsPerMilli = 1.0 * DPI / 10 / 2.54;

       IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize");
       horiz.setAttribute("value", Double.toString(dotsPerMilli));

       IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize");
       vert.setAttribute("value", Double.toString(dotsPerMilli));

       IIOMetadataNode dim = new IIOMetadataNode("Dimension");
       dim.appendChild(horiz);
       dim.appendChild(vert);

       IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0");
       root.appendChild(dim);

       metadata.mergeTree("javax_imageio_1.0", root);
    }    

}
导入java.awt.EventQueue;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入java.util.Iterator;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.imageio.IIOImage;
导入javax.imageio.imageio;
导入javax.imageio.ImageTypeSpecifier;
导入javax.imageio.ImageWriteParam;
导入javax.imageio.ImageWriter;
导入javax.imageio.metadata.IIOInvalidTreeException;
导入javax.imageio.metadata.iimetadata;
导入javax.imageio.metadata.iimetadatanode;
导入javax.imageio.stream.ImageOutputStream;
导入javax.print.Doc;
导入javax.print.DocFlavor;
导入javax.print.DocPrintJob;
导入javax.print.PrintException;
导入javax.print.PrintService;
导入javax.print.PrintServiceLookup;
导入javax.print.ServiceUI;
导入javax.print.SimpleDoc;
导入javax.print.attribute.HashPrintRequestAttributeSet;
导入javax.print.attribute.PrintRequestAttributeSet;
导入静态javax.print.attribute.ResolutionSyntax.DPI;
导入javax.print.attribute.standard.Copies;
导入javax.print.attribute.standard.Fidelity;
导入javax.print.attribute.standard.MediaPrintableArea;
导入javax.print.attribute.standard.MediaSizeName;
导入javax.print.attribute.standard.orientationrequired;
导入javax.print.attribute.standard.PrintQuality;
导入javax.print.attribute.standard.PrinterResolution;
导入javax.print.event.PrintJobEvent;
导入javax.print.event.PrintJobListener;
导入javax.print.event.PrintServiceAttributeEvent;
公共类PNGPrintingExample{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
EventQueue.invokeLater(()->{
试一试{
FileInputStream imageFile=null;
imageFile=newfileinputstream(“E:\\1-and-2-1.png”);
BuffereImage输入=ImageIO.read(imageFile);
文件输出=新文件(“E:\\To print.png”);
saveGridImage(输出、输入);
imageFile=新文件输入流(输出);
//设置文档类型
DocFlavor myFormat=DocFlavor.INPUT\u STREAM.PNG;
//构建一组属性
PrintRequestAttributeSet aset=新的HashPrintRequestAttributeSet();
//设置介质大小和打印介质属性
aset.add(MediaSizeName.ISO_A10);
aset.add(新的MediaPrintableArea(0,0,35,24,MediaPrintableArea.MM));
aset.add(打印质量高);
aset.add(新的PrinterResolution(203203,PrinterResolution.DPI));
//可能需要添加一些属性
aset.add(要求方向。纵向);
增加(新副本(7));
aset.add(Fidelity.Fidelity\u TRUE);
DocPrintJob;
Doc myDoc=new SimpleDoc(imageFile,myFormat,null);
打印服务[]服务=
PrintServiceLookup.lookupPrintServices(myFormat,null);
PrintService defaultPrintService=PrintServiceLookup
.lookupDefaultPrintService();
打印服务选择打印服务=
ServiceUI.printDialog(null、150、150、,
服务,defaultPrintService,myFormat,aset);
如果(selectedPrintService!=null)
{
System.out.println(“所选打印机:”
+selectedPrintService.getName());
试一试{
job=selectedPrintService.createPrintJob();
//创建文档
PrintJobListener pjlForP=新的PrintJobListener(){
公共无效属性更新(PrintServiceAttributeEvent e){
系统输出打印项次(“更新”);
}
@凌驾
public void printJobNoMoreEvents(PrintJobEvent e){
System.out.println(“可能被发送到”+e.getPrintJob().getPrintService());
}
@凌驾
公共作废printDataTransferCompleted(PrintJobEvent pje){
System.out.println(“打印数据传输完成”);
}
@凌驾
公共作废打印作业已完成(打印作业事件pje){