JAVA估计打印总页数

JAVA估计打印总页数,java,printing,Java,Printing,我有一个问题,当我使用自己的可打印类时,如何检查将打印多少页。 我需要它,因为我想在每一页的页脚都有“页码/总页数”。 在我的例子中,行估计的问题是行被包装。此外,一些文本行中有空行,还有一些其他情况可能会阻止文本的定期传播。一般来说,这不是统一打印。 如您所知,渲染过程在调用所有打印对话框窗口后完成。 有没有办法解决这个问题,或者我应该启动打印模拟,以接收真实的页面数?或者我应该实现其他类吗? 关于您可以使用以下内容获取页数: int linesPerPage; // No. o


我有一个问题,当我使用自己的
可打印类时,如何检查将打印多少页。
我需要它,因为我想在每一页的页脚都有“页码/总页数”。
在我的例子中,行估计的问题是行被包装。此外,一些文本行中有空行,还有一些其他情况可能会阻止文本的定期传播。一般来说,这不是统一打印。
如您所知,渲染过程在调用所有打印对话框窗口后完成。
有没有办法解决这个问题,或者我应该启动打印模拟,以接收真实的页面数?或者我应该实现其他类吗?

关于

您可以使用以下内容获取页数:

int linesPerPage;        // No. of lines per Page to be drawn.
static int numPages;     // No. of pages too be rendered.

public int getNumberOfPages()   // Override method to get Number Of Pages.
{
     return numPages;
}
大体上

    linesPerPage = (int)Math.floor(format.getImageableHeight()/linespacing);
    numPages = (DATA_to_Print.length - 1)/linesPerPage + 1;
在覆盖打印方法中

    if ((pagenum < 0) | (pagenum >= numPages)) 
    {
        return NO_SUCH_PAGE;
    }  
if((pagenum<0)|(pagenum>=numPages))
{
不返回此类页面;
}  

每次调用print方法时,numPages的值都会增加。

我知道了怎么做。也许这并不优雅,但它是有效的(我用1200页的文档测试了估算,估算是准确的)。
我将向您展示两行代码所支持的概念,因为我的
可打印的
类很复杂。
该类调用与打印相关的所有操作:

package print_manager;

import icd_searcher.ResultContainer;
import java.awt.Point;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import others.MeasuredBox;


public class PrintManager
{
    private PrinterJob printerJob;
    private SimpleResultPrinter srp;


    /**
     * Print printable object.
     * 
     * @param toPrint
     */
    public void initPrint(ResultContainer resultToPrint)
    {
        printerJob = PrinterJob.getPrinterJob();

        PageFormat selectedArea = printerJob.pageDialog(printerJob.defaultPage());
        MeasuredBox margin = new MeasuredBox(new Point((int) selectedArea.getImageableX(), (int) selectedArea.getImageableY()), (int) selectedArea.getImageableWidth(), (int) selectedArea.getImageableHeight() - 72);
        srp = new SimpleResultPrinter(resultToPrint, margin);

        SimpleResultPrinterSimulator srpSimulation = new SimpleResultPrinterSimulator(resultToPrint, margin);

        // total pages simulation
        int totalPages = 0;
        try
        {
            while (srpSimulation.print(selectedArea, totalPages) != Printable.NO_SUCH_PAGE)
            {
                totalPages++;
            }
        }
        catch (PrinterException e)
        {
            e.printStackTrace();
        }

        printerJob.setPrintable(srp, widenedPage);

        if (printerJob.printDialog())
        {
            try
            {
                printerJob.print();
            }
            catch (PrinterException exc)
            {
                System.out.println(exc);
            }
        }
    }
}
方法打印在
SimpleResultPrinter

public int print(Graphics g, PageFormat page, int pageIndex) throws 
PrinterException {...}
方法在
SimpleResultPrinterSimulator中打印

public int print(PageFormat page, int pageIndex) throws PrinterException
    {...}
您需要了解这一点:
MeasuredBox
ResultContainer
是我的自定义类,在这个概念中没有任何意义-将它们视为“某些类”。
SimpleResultPrinter
是可打印的
具有方法
print(…)
,该方法由
printerJob.print()调用
SimpleResultPrinterSimulator
SimpleResultPrinterSimulator
具有相同的方法
print(…)
SimpleResultPrinterSimulator
类似,只是其中没有用于提高性能的绘图操作,当然
SimpleResultPrinterSimulator
只有此方法。另外,
SimpleResultPrinterSimulator
扩展了
Component
,因为我需要图形对象来测量字体高度。 我的解决方案就是启动打印模拟,
print(…)
执行与打印过程中相同的操作,除了对任何
图形
对象进行真实绘制。最后我收到了总页数。
我知道这并不优雅,我做了两次相同的操作(性能损失),但我看不到任何其他方法来估计复杂打印中的页数