我有疑问当我使用自己的课程时如何检查将打印多少页Printable
。
我需要它,因为我想在每页的页脚中有“page_number/total_pages”。
在我的情况下,行估计的问题是行被包装了。另外,一些文本行之间是空行,还有一些其他情况可以防止文本的常规传播。通常这不是统一的打印。
如您所知,渲染过程是在调用所有打印对话框窗口后完成的。
有什么办法可以解决这个问题,或者我应该以某种方式启动打印模拟,以接收真实的页数?或者也许我应该实现其他一些类?
问候
2 回答
您可以使用以下来获得否。页数:
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;
}
每次调用 print 方法时,numPages 的值都会增加。
我想出了怎么做。也许这并不优雅,但它有效(我用 1200 页的文档测试了估计,估计是准确的)。
我将向您展示几行代码支持的概念,因为我的Printable
类很复杂。
这是调用与打印相关的所有操作的类:
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
Printable
print(...)
printerJob.print()
SimpleResultPrinterSimulator
print(...)
SimpleResultPrinter
SimpleResultPrinterSimulator
SimpleResultPrinterSimulator
Component
print(...)
Graphics
我知道这并不优雅,我做了两次相同的动作(性能损失),但我没有看到任何其他方法来估计复杂打印中的页数。