【问题标题】:PDFBox. Java: How to print only one page of PDF instead of full document?PDF盒子。 Java:如何只打印一页 PDF 而不是完整文档?
【发布时间】:2016-03-22 04:54:03
【问题描述】:

我想打印 pdf 文件的特定页面。例如,我有 4 页的 pdf,我想打印第三页。我正在使用 Apache PDFBox 库。我试图删除我想要打印的页面以外的其他页面,但它现在打印除了我想要打印的页面之外的所有其他页面......有什么帮助吗?

这是我写的函数代码:

void printPDFS(String fileName, int i) throws PrinterException, IOException{
    PrinterJob printJob = PrinterJob.getPrinterJob();
    printJob.getPrintService();          
   // String test = "\\\\192.168.5.232\\failai\\BENDRAS\\DHL\\test2.pdf";
    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintService(printJob.getPrintService());
    PDDocument doc = PDDocument.load(fileName);

    for(int j=1;j<=doc.getNumberOfPages();j++){
        if(i!=j)
        {
            doc.removePage(j);                
        }
     }
   doc.silentPrint(job);
}

我已将此行添加到代码中:System.out.println(doc.getPageMap());

控制台给我:{13,0=4, 1,0=2, 7,0=3, 27,0=1} 什么意思?

【问题讨论】:

  • 您打印的只是意味着第 4 页是第 0 代中的对象 4,第 2 页是第 0 代中的对象 1 ...;这些是您通常不需要担心的 pdf 内部事物(即它是 pdf 对象的 id;如果您将文档作为文本文件打开,您应该是一个带有条目 /Kids [27 0 R 1 0 R 7 0 R 13 0 R] 的 pages 字典)。

标签: java pdf printing pdfbox


【解决方案1】:

您的代码不起作用,因为您没有考虑到删除页面也会更改较高索引的页面索引并减少页面数量。页面索引也是从 0 开始的。删除这样的页面,它应该可以工作:

i = Math.max(-1, Math.min(i, doc.getNumberOfPages()));

// remove all pages with indices higher than i
for (int j = doc.getNumberOfPages()-1; j > i; j--) {
    doc.removePage(j);
}

// remove all pages with indices lower than i
for (int j = i-1; j >= 0; j--) {
    doc.removePage(j);
}

或者更接近你的实现:

for(int j=doc.getNumberOfPages()-1; j >= 0; j--){
    if(i!=j)
    {
        doc.removePage(j);                
    }
}

【讨论】:

  • 不,仍然没有打印。现在我为 i "1" 赋值并打印了第三 (3/4) 页。而不是第一页。
  • @Rokas:我刚刚(再次)对其进行了测试,如果我将 1 作为i 传递,两个版本都按预期打印 second 页面,这是预期的行为(基于 0 的索引,请记住,如果您想传递基于 1 的索引,只需在方法开头减去 1)。您的代码/pdf 一定有其他问题,您没有告诉我们。你是否例如不同的页面标签而忘记提及?你能把pdf上传到某个地方吗?如果我无法重现问题,我无法帮助您。顺便说一句:您使用哪个版本的 pdfbox?
  • @so 如果我想打印 4/4 或 1/2 我该怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 2012-01-25
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 2012-03-01
相关资源
最近更新 更多