2009-10-26 3 views
0

Мое приложение позволяет пользователю печатать содержимое экрана, состоящее из нескольких элементов управления Swing (изображения, тексты и т. Д.) - печатная панель сама длинна (несколько страниц) и ширина около 600 пикселей.Печать на Java - страница

Поскольку я точно знаю, что каждый макет страницы (я помещаю точное количество изображений и компонентов) на каждую страницу (общее количество изображений является динамическим), я могу точно рассчитать, сколько страниц мне потребуется для печати.

Я реализовал интерфейс печати следующим образом:

public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setColor(Color.BLACK); //set default foreground color to black 
    RepaintManager.currentManager(this).setDoubleBufferingEnabled(false); 
    Dimension d = this.getSize(); //get size of document 
    double panelWidth = d.width; //width in pixels 
    double panelHeight = d.height; //height in pixels 
    double pageHeight = pf.getImageableHeight(); //height of printer page 
    double pageWidth = pf.getImageableWidth(); //width of printer page 
    double scale = pageHeight/panelHeight; 
    int totalNumPages = (int) Math.ceil(scale * panelWidth/pageWidth); 

    if (pageIndex >= totalNumPages) { 
      return Printable.NO_SUCH_PAGE; 
    } 


    g2.translate(pf.getImageableX(), pf.getImageableY()); 
    g2.translate(0f, -pageIndex * pageHeight); 
    g2.scale(scale, scale); 
    this.paint(g2); 
    return Printable.PAGE_EXISTS; 
} 

Кажется, что все работает нормально. Поскольку у меня нет принтера, я тестировал его с помощью принтера PDF и нескольких принтеров клиентов, и результаты были хорошими.

Однако на одном из моих пользовательских принтеров - кажется, что что-то не работает с расчетом, так как он разбивает страницу посередине изображений.

Есть ли более элегантный способ выполнения этих расчетов? Могу я добавить вместо этого уведомление о «перерыве страницы»?

Благодаря

+0

Пожалуйста, отформатируйте код для лучшей читаемости. –

ответ

1

В прошлом я обнаружил, что пытается реализовать интерфейс для печати и сам вызвавший такие вопросы, как вы испытываете форматирование. Одна вещь, которую я делал в прошлом, которая значительно уменьшила усилия с моей стороны и хорошо работала, использовала JasperReports для управления этим. Вы можете создать определение jrxml с одним изображением/страницей, а затем просто передать изображения в jasperreport. Отсюда вы можете использовать объект JasperPrint и отправить его прямо на принтер. Это хорошо сработало для меня. Кроме того, он имеет несколько преимуществ, поскольку экспорт уже встраивается в отчеты яшмы, такие как pdf, если это необходимо.

0

Сам код выглядит нормально, особенно если он работает для принтера PDF. У меня просто есть идеи для отладки:

1) Вы проверили настройки принтера для пользовательского принтера? Возможно, размер страницы установлен неправильно. 2) Можно ли подключить машину разработки к этому принтеру и отладить его?
3) Если нет, вы можете добавить регистрацию, чтобы сообщить вам pg.getImageableWidth и pg.getImageableHeight и другую информацию на протяжении всего расчета, чтобы увидеть, где это неправильно.

Смежные вопросы