Can';在Windows中找不到使用java的打印服务

Can';在Windows中找不到使用java的打印服务,java,windows,printing,Java,Windows,Printing,我正在试图找到一个可以处理作业的打印服务,我正在使用Java中的打印服务API。 这是我的代码: private PrintService[] services = null; services = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.PDF, null); System.out.println("We found : " + services.length + " service(s)"); 输出总是

我正在试图找到一个可以处理作业的打印服务,我正在使用Java中的打印服务API。 这是我的代码:

private PrintService[] services = null;

services = PrintServiceLookup.lookupPrintServices(DocFlavor.INPUT_STREAM.PDF, null);

System.out.println("We found : " + services.length + " service(s)");
输出总是:

We found : 0 service(s)
我不知道为什么它找不到服务,虽然我的计算机上安装了打印机!注意到:

  • 这台打印机很好用
  • 我以前在使用Linux操作系统时使用了相同的代码,它工作正常。现在我正在使用Windows

未找到与指定DocFlavor:“PDF”对应的PrintService
因为当我试图找出打印机支持的DocFlavor时:

PrintService[] prnSvc = PrintServiceLookup.lookupPrintServices(null, null);

    DocFlavor[] docFalvor = prnSvc[0].getSupportedDocFlavors();
    for (int i = 0; i < docFalvor.length; i++) {
        System.out.println(docFalvor[i].getMimeType());
    }

类似帖子:而且

Windows下的PDF功能似乎有问题。我遇到了同样的问题,还没有找到解决办法。 其他人已经找到了一个解决办法,但这似乎是非法的(见)

编辑

我通过将PDF转换为PNG图像来解决这个问题

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

import static java.awt.image.BufferedImage.TYPE_INT_RGB;
import static javax.imageio.ImageIO.write;
import static org.apache.pdfbox.pdmodel.PDDocument.load;

public class PdfToImageConverter {

    public static String GIF = "gif";
    public static String JPG = "jpg";
    public static String PNG = "png";

    public static byte[] convertPdfTo(final String imageType, final byte[] pdfContent) throws IOException {
        final PDDocument document = load(new ByteArrayInputStream(pdfContent));
        final List<PDPage> allPages = document.getDocumentCatalog().getAllPages();
        final PDPage pdPage = allPages.get(0);
        final BufferedImage image = pdPage.convertToImage(TYPE_INT_RGB, 300);
        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        write(image, "png", outputStream);
        outputStream.flush();

        final byte[] imageInByte = outputStream.toByteArray();

        outputStream.close();

        return imageInByte;
    }

}
import org.apache.pdfbox.pdmodel.PDDocument;
导入org.apache.pdfbox.pdmodel.PDPage;
导入java.awt.image.buffereImage;
导入java.io.ByteArrayInputStream;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.util.List;
导入静态java.awt.image.BufferedImage.TYPE\u INT\u RGB;
导入静态javax.imageio.imageio.write;
导入静态org.apache.pdfbox.pdmodel.PDDocument.load;
公共类PDFTO图像转换器{
公共静态字符串GIF=“GIF”;
公共静态字符串JPG=“JPG”;
公共静态字符串PNG=“PNG”;
公共静态字节[]convertPdfTo(最终字符串imageType,最终字节[]PDFCContent)引发IOException{
最终PDDocument文件=加载(新的ByteArrayInputStream(pdfContent));
最终列表allPages=document.getDocumentCatalog().getAllPages();
final PDPage PDPage=allPages.get(0);
final buffereImage image=pdPage.convertToImage(类型为INT\u RGB,300);
final ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
写入(图像,“png”,输出流);
outputStream.flush();
最终字节[]imageInByte=outputStream.toByteArray();
outputStream.close();
返回图像字节;
}
}
我将
MediaSizeName.ISO_A4
作为PrintRequestAttribute添加到PrintJob中,这个解决方案对我很有效

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;

import static java.awt.image.BufferedImage.TYPE_INT_RGB;
import static javax.imageio.ImageIO.write;
import static org.apache.pdfbox.pdmodel.PDDocument.load;

public class PdfToImageConverter {

    public static String GIF = "gif";
    public static String JPG = "jpg";
    public static String PNG = "png";

    public static byte[] convertPdfTo(final String imageType, final byte[] pdfContent) throws IOException {
        final PDDocument document = load(new ByteArrayInputStream(pdfContent));
        final List<PDPage> allPages = document.getDocumentCatalog().getAllPages();
        final PDPage pdPage = allPages.get(0);
        final BufferedImage image = pdPage.convertToImage(TYPE_INT_RGB, 300);
        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        write(image, "png", outputStream);
        outputStream.flush();

        final byte[] imageInByte = outputStream.toByteArray();

        outputStream.close();

        return imageInByte;
    }

}