我正在尝试使用 apache 的 pdfbox 来打印 pdf 文件,因此我创建了一个负责打印任何 pdf 文件的 Controller 。正如您在下面的代码中看到的, Controller 只有一个带有文件路径参数的公共(public)方法。 Controller 运行无异常,但不打印任何内容:
public class ControladorImpressao {
@Value("${nome.impressora}")
private String nomeImpressora;
private PDDocument arquivoPDF;
private Logger logger = LoggerFactory.getLogger(this.getClass());
public boolean imprimir(String arquivo) {
try {
carregarArquivoPDF(arquivo);
iniciarImpressao(arquivo);
return true;
} catch (Exception e) {
logger.error("Erro ao tentar imprimir documento!",e);
}
return false;
}
private void carregarArquivoPDF(String arquivo) {
try {
arquivoPDF=new PDDocument();
arquivoPDF.load(arquivo);
}
catch (Exception e) {
logger.error("Erro ao abrir pdf!",e);
}
}
private void iniciarImpressao(String nomeArquivo) throws PrinterException {
PrintService impressora=recuperarImpressora();
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintService(impressora);
job.setJobName(nomeArquivo);
job.setCopies(1);
arquivoPDF.silentPrint(job);
}
private PrintService recuperarImpressora() {
PrintService[] printServices = PrinterJob.lookupPrintServices();
for (int count = 0; count < printServices.length; ++count) {
if (nomeImpressora.equalsIgnoreCase(printServices[count].getName())) {
return printServices[count];
}
}
return null;
}
}
我在 maven 中使用 pdfbox 1.7.0 版:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>1.7.0</version>
</dependency>
我做错了什么?
最佳答案
解决了更改我实例化 PDDocument 的方式(现在我正在使用静态加载)和更改我使用 PrinterJob 的方式的问题:
public class ControladorImpressao {
@Value("${nome.impressora}")
private String nomeImpressora;
private PDDocument arquivoPDF;
private Logger logger = LoggerFactory.getLogger(this.getClass());
public boolean imprimir(String arquivo) {
try {
arquivoPDF=PDDocument.load(new File(arquivo));
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintService(recuperarImpressora());
job.setJobName(arquivo);
job.setPageable(arquivoPDF);
job.print();
return true;
} catch (Exception e) {
logger.error("Erro ao tentar imprimir documento!",e);
}
return false;
}
private PrintService recuperarImpressora() {
PrintService[] printServices = PrinterJob.lookupPrintServices();
for (int count = 0; count < printServices.length; ++count) {
if (nomeImpressora.equalsIgnoreCase(printServices[count].getName())) {
return printServices[count];
}
}
return null;
}
}
我注意到一个有趣的事情是,如果你使用静态加载方法,我会使用:
arquivoPDF=new PDDocument();
arquivoPDF.load(arquivo);
我仍然无法打印任何东西,可能是加载方法的问题。 感谢@yms,如果他不告诉我 PdfBox 文档中的注释,我可能会走另一条路。
关于java - 无法使用 pdfbox 打印任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14692951/