0

在打印 PDF 文档时,我使用Book类为页面提供不同的方向。

但是当我使用 Book 类时,只打印第一页。其他页面不打印。但是 Book#getNumberOfPages还给我4

我的代码如下所示:

   public static getDoc(DocAttributeSet dset) {
        final PDFFile pdfFile = new PDFFile(buf);
            Book book = new Book();
            for (int i=0; i<pdfFile.getNumPages(); i++) {
                PDFPage page = pdfFile.getPage(i);
                PageFormat pageFormat =  new PageFormat();

                if (page.getAspectRatio() >= 1) {
                    pageFormat.setOrientation(PageFormat.LANDSCAPE);
                } else {
                    pageFormat.setOrientation(PageFormat.PORTRAIT);
                }
                boolean needStop = false;
                if (pdfFile.getNumPages() - 1 == i ) { // if latest page, then stopping ('needStop' = NO_SUCH_PAGE)
                    needStop = true;
                }
                book.append(getPrintable(page, needStop), pageFormat);
            }
          return new SimpleDoc(book, DocFlavor.SERVICE_FORMATTED.PAGEABLE, dset);
      }    

    private static Printable getPrintable(final PDFPage page, final boolean needStop) {
            return new Printable() {
                public int print(Graphics g, PageFormat pageFormat, int index) throws PrinterException {
                    if (needStop) {
                        return NO_SUCH_PAGE;
                    }

                    // no scaling, center PDF
                    ... // code omitted

                    return PAGE_EXISTS;

                }
            };
    }

请注意:我使用此代码打印文档:

DocPrintJob job = prn.createPrintJob();
job.print(myDoc, aset);

即我不使用旧 API:

Book bk = new Book();       
job.setPageable(bk);    
4

3 回答 3

1

解决方案是在“书”中放置要打印的最大页数,可能是 3 或 10,这并不意味着它会打印所有 10,只标记书的大小:

book.append(getPrintable(page, needStop), pageFormat, numPages);
于 2013-05-25T13:12:10.513 回答
0

这是我放在一起的测试代码...

它不打印 PDF,但测试页面方向和页数的变化。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import static java.awt.print.Printable.NO_SUCH_PAGE;
import static java.awt.print.Printable.PAGE_EXISTS;
import java.awt.print.PrinterException;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.DocAttributeSet;
import javax.print.attribute.HashDocAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;

public class TestBook {

    public static void main(String[] args) {
        DocFlavor psInFormat = DocFlavor.INPUT_STREAM.AUTOSENSE;

        HashDocAttributeSet docAttSet = new HashDocAttributeSet();
        Doc myDoc = getDoc(docAttSet);
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
        PrintService[] services = PrintServiceLookup.lookupPrintServices(psInFormat, aset);

        // this step is necessary because I have several printers configured  
        PrintService myPrinter = null;
        for (int i = 0; i < services.length; i++) {
            String svcName = services[i].toString();
            System.out.println("service found: " + svcName);
            if (svcName.contains("DocuCentre-III C3100")) {
                myPrinter = services[i];
                System.out.println("my printer found: " + svcName);
                break;
            }
        }

        if (myPrinter != null) {
            DocPrintJob job = myPrinter.createPrintJob();
            try {
                job.print(myDoc, aset);

            } catch (Exception pe) {
                pe.printStackTrace();
            }
        } else {
            System.out.println("no printer services found");
        }
    }

    public static SimpleDoc getDoc(DocAttributeSet dset) {
        Book book = new Book();
        for (int i = 0; i < 4; i++) {
            PageFormat pageFormat = new PageFormat();

            if (i % 2 == 0) {
                pageFormat.setOrientation(PageFormat.LANDSCAPE);
            } else {
                pageFormat.setOrientation(PageFormat.PORTRAIT);
            }
            boolean needStop = false;
            if (3 == i) { // 'needStop' = NO_SUCH_PAGE
                needStop = true;
            }
            book.append(getPrintable(i, needStop), pageFormat);
        }
        System.out.println("Book = " + book.getNumberOfPages());
        return new SimpleDoc(book, DocFlavor.SERVICE_FORMATTED.PAGEABLE, dset);
    }

    private static Printable getPrintable(int page, boolean needStop) {
        return new MyPage(page, needStop);
    }

    public static class MyPage implements Printable {

        private int page;
        private boolean needStop;

        public MyPage(int page, boolean needStop) {
            this.page = page;
            this.needStop = needStop;
        }

        public int print(Graphics g, PageFormat pageFormat, int index) throws PrinterException {
            g.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY());
            System.out.println("Printing " + page);
            Font font = new Font("Arial", Font.BOLD, 128);
            g.setColor(Color.BLACK);
            g.setFont(font);
            g.drawString(String.valueOf(index), 0, g.getFontMetrics().getAscent());

//            if (needStop) {
//                return NO_SUCH_PAGE;
//            }
            return PAGE_EXISTS;

        }
    }
}

从外观上看,你的needStop位置错了。只有在实际上不需要打印更多页面时才应该调用它,但是我阅读您的代码的方式(我可能是错的)似乎想要跳过最后一页。

但是,经过测试,您似乎实际上并不需要它(因为Book知道它要打印多少页;))

于 2013-04-16T06:27:24.473 回答
0

你应该实现这样print()的方法Printable

@Override
public int print(Graphics g, PageFormat pf, int pageNumber)
        throws PrinterException {
    if (pageNumber < book.getNumberOfPages()) {
        // Printing code here

        return PAGE_EXISTS;
    }
    return NO_SUCH_PAGE;
}

为此,您必须引用您的book实例,这可以通过使用上述方法定义制作内部类Page实现接口来实现。Printableprint()

于 2015-03-20T05:38:55.733 回答