2016-10-10 61 views
1

我已經編寫了使用傳入的打印機名稱和PDF URL打印PDF的代碼。這是有效的,除了當我傳遞一個帶有中文字符的PDF時,這些字符就是盒子。 Unicode字體嵌入PDF,所以理想情況下,我想以某種方式利用它。這裏是打印的代碼:使用嵌入式字體的Java打印PDF

PDDocument document = PDDocument.load(new URL(fileUrl)); 

PrinterJob job = PrinterJob.getPrinterJob(); 
job.setPrintService(printer); 

PageFormat pageFormat = job.defaultPage(); 
Paper paper = pageFormat.getPaper(); 
Book pBook = new Book(); 

List allPages = document.getDocumentCatalog().getAllPages(); 

for (Object pdPage : allPages) 
{ 
    PDPage page = (PDPage) pdPage; 
    double width = page.findMediaBox().getWidth(); 
    double height = page.findMediaBox().getHeight(); 
    double margin = 0.0d; 
    paper.setSize(width, height); 
    paper.setImageableArea(margin, margin, width - (margin * 2), height - (margin * 2)); 
    pageFormat.setOrientation(PageFormat.PORTRAIT); 
    pageFormat.setPaper(paper); 
    PageFormat validatePage = job.validatePage(pageFormat); 
    pBook.append(document.getPrintable(allPages.indexOf(pdPage)), validatePage); 
    job.setPageable(pBook); 
} 

job.setJobName(jobName); 
job.print(); 

正如你所看到的,我正在使用PDFBox(版本1.8.7)。我已經完成了一些搜索,但我找不到任何有用的東西。但是,我確實發現了這個JIRA問題:https://issues.apache.org/jira/browse/PDFBOX-490

看起來可能是在2.0版本中完成的,該版本是在今年(2016年)發佈的。有一次,我嘗試更新到最新版本,但是有太多變化,我選擇不要。

更新我唯一的選擇? 1.8.7有什麼我可以做的嗎?

謝謝!

+1

*「看來或許真的是在2.0版本做了」 * - 實際上,與預先2.0版本,你不會成功。 – mkl

回答

1

根據mkl的評論,我更新到版本2.0.3和中文字符正確打印。這是相較於我的舊我的新代碼,看看有什麼是必要的更新:

PrinterJob job = PrinterJob.getPrinterJob(); 
job.setPrintService(printer); 

PageFormat pageFormat = job.defaultPage(); 
Paper paper = pageFormat.getPaper(); 
Book pBook = new Book(); 

PDDocument document = PDDocument.load(new URL(fileUrl).openStream()); // Needs to be a stream now 

PDPageTree allPages = document.getPages(); // no getDocumentCatalog 
for (Object pdPage : allPages) 
{ 
    PDPage page = (PDPage) pdPage; 
    double width = page.getMediaBox().getWidth(); // getMediaBox instead of find 
    double height = page.getMediaBox().getHeight(); // getMediaBox instead of find 
    double margin = 0.0d; 
    paper.setSize(width, height); 
    paper.setImageableArea(margin, margin, width - (margin * 2), height - (margin * 2)); 
    pageFormat.setOrientation(PageFormat.PORTRAIT); 
    pageFormat.setPaper(paper); 
    PageFormat validatePage = job.validatePage(pageFormat); 
    pBook.append(new PDFPrintable(document), validatePage, document.getNumberOfPages()); // Completely different 
} 

job.setPageable(pBook); // Moved this out of the loop, just cause it only needs to be called once 
job.setJobName(jobName); 
job.print();