Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбить данные на страницы при печати 
:(
    Опции темы
cromm3
Дата 8.5.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



Всем привет! 
Есть элемент JEditorPane его содержимое нужно распечатать на принтере с сохранением стилей текста и разметки… если содержимое JEditorPane умещается на одной странице, проблем нет. Вот как выглядеть код для печати:
Код

 Image img = JEditorPane1.createImage(1,1);
    PrintJob pj = getToolkit().getPrintJob(this, "Printing", null);
    if (pj!=null)
    {
      Graphics g = pj.getGraphics();
      g.drawImage(img, 0,0, null);
      JEditorPane1.paint(g);
      if (g!=null)
      {
        JEditorPane1.print(g);
        g.dispose();
      }
      pj.end();
    }

Если не умещается на одной странице, то нужно разбивать на несколько, но вот как это сделать? Ясно, что нужно просто снимать картинку со всего JEditorPane и резать ее на части… но как это сделать? Чем? createImage не получается…  
Спасибо!  
PM   Вверх
powerOn
Дата 8.5.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Често говоря сам я печать никогда не делал на Java, но пару ссылок нашел:

http://java.sun.com/j2se/1.4.2/docs/api/ja...t/Pageable.html
http://java.sun.com/j2se/1.4.2/docs/api/ja...PrinterJob.html

видимо твой класс должен поддерживать интерфейс Pagable, чтобы была возможность его распечатать постранично.
У PrintJob, вероятно, нужно присмотреться к методу setPageable(Pageable document) ...

удачи!

Добавлено @ 21:25 
Т.к. мне эта тема интересна, то задам еще вопрос:  
cromm3, а нельзя ли производить печать содержимого JEditorPane ввиде TEXT/HTML, а не снимать картинку со всего JEditorPane? 


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
w1nd
Дата 8.5.2006, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Есть куча платных и бесплатных (но плохоньких) библиотек, которые реализуют разбивку на страницы при печати свингового компонента. НО. Лучше заюзать отчетник - возможностей больше, геморроя меньше (JFreeReport или JasperReport отлично себя зарекомендовали; там даже превьюшечные компоненты есть).
Хотя есть вариант - перейти на 1.6 - там, говорят, компоненты научены печатать страницами.
Цитата
нельзя ли производить печать содержимого JEditorPane ввиде TEXT/HTML

На страницы как будете бить? smile И вообще, на принтер можно выводить (обычно) только postscript, gl (зависит от принтера) или графику. На некоторые принтеры текст вообще нельзя печатать - не поймет. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
cromm3
Дата 8.5.2006, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



Цитата

Есть куча платных и бесплатных (но плохоньких) библиотек, которые реализуют разбивку на страницы при печати свингового компонента. 

Хотя бы плохеньких… есть что нить для примера?smile)

Цитата

нельзя ли производить печать содержимого JEditorPane ввиде TEXT/HTML

В общем-то, w1nd, прав, принтеру нужна графика…. В любом случаи текст будет переведен именно в графический вид(как я это понимаю)... 
PM   Вверх
w1nd
Дата 8.5.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



У меня где-то валяется класс, показывающий содержимое JTextArea в страницах и печатающий её. Могу порыться.  


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
cromm3
Дата 8.5.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



Цитата

У меня где-то валяется класс, показывающий содержимое JTextArea в страницах и печатающий её. Могу порыться.

Если будет возможность, выложи, пожалуйста... 
PM   Вверх
w1nd
Дата 8.5.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Вот этот класс:
Код
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.swing.AbstractAction;
import javax.swing.CellRendererPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.JToolBar;
import javax.swing.Scrollable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;

public class PrintPreviewPane extends JPanel implements Scrollable, SwingConstants, Printable {

    public static final String PROPERTY_PAGECOMPONENT = "pageComponent";
    public static final String PROPERTY_PAGEFORMAT = "pageFormat";
    public static final String PROPERTY_PAGENUMBER = "pageNumber";
    public static final String PROPERTY_PAGESCALE = "pageScale";

    public static final double MIN_PAGESCALE = 0.1;
    public static final double MAX_PAGESCALE = 1.0;
    
    private Component pageComponent;

    public Component getPageComponent() {
        return pageComponent;
    }
    
    public void setPageComponent(Component pageComponent) {
        firePropertyChange(PROPERTY_PAGECOMPONENT, this.pageComponent, this.pageComponent = pageComponent);
    }
    
    private PageFormat pageFormat;
    
    public PageFormat getPageFormat() {
        return pageFormat;
    }
    
    public void setPageFormat(PageFormat pageFormat) {
        Dimension size = new Dimension(
            (int)pageFormat.getImageableWidth(), 
            (int)pageFormat.getImageableHeight());

        setSize(size);
        if (!isPreferredSizeSet()) {
            setPreferredSize(size);
        }

        firePropertyChange(PROPERTY_PAGEFORMAT, this.pageFormat, this.pageFormat = pageFormat);
    }
    
    private int pageNumber;
    
    public int getPageNumber() {
        return pageNumber;
    }
    
    public void setPageNumber(int pageNumber) {
        firePropertyChange(PROPERTY_PAGENUMBER, this.pageNumber, this.pageNumber = pageNumber);
    }
    
    public boolean isPageNumberExists(int pageNumber) {
        int pageCount = (int)(pageComponent.getPreferredSize().height / pageFormat.getImageableHeight());
        if (pageComponent.getPreferredSize().height % pageFormat.getImageableHeight() > 0) {
            pageCount++;
        }
        return pageNumber < pageCount;
    }
    
    private CellRendererPane rendererPane = new CellRendererPane();
    
    public PrintPreviewPane(Component pageSource, PageFormat pageFormat) {
        setPageComponent(pageSource);
        setPageFormat(pageFormat);
    }
    
    @Override
    protected void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        
        Graphics2D graphics2d = (Graphics2D)graphics;

        Rectangle paintRect = new Rectangle(
                getWidth(), 
                getHeight());
                
        Rectangle paperRect = new Rectangle(
                (int)pageFormat.getImageableWidth(),
                (int)pageFormat.getImageableHeight());
        
        graphics2d.clipRect(
                paintRect.x, 
                paintRect.y, 
                paintRect.width, 
                paintRect.height);
        
        double scaleX = 
            (double)paintRect.width / (double)paperRect.width;
        double scaleY = 
            (double)paintRect.height / (double)paperRect.height;
        
        Dimension size = getParent().getSize();
                
        int offsetX =
            (int)((size.width - paintRect.width) / scaleX);
        if (offsetX < 0) {
            offsetX = 0;
        }
        
        int offsetY =
            (int)((size.height - paintRect.height) / scaleY);
        if (offsetY < 0) {
            offsetY = 0;
        }
        
        int pageOffset = 
            pageNumber * paperRect.height;
        
        graphics2d.scale(
                scaleX, 
                scaleY);
        
        graphics2d.setColor(
                UIManager.getColor("TextArea.background"));
        graphics2d.fillRect(
                paintRect.x + offsetX, 
                paintRect.y + offsetY, 
                paintRect.width, 
                paintRect.height);
        
        rendererPane.paintComponent(
                graphics2d, 
                pageComponent, 
                this, 
                paintRect.x + offsetX, 
                paintRect.y + offsetY - pageOffset, 
                paperRect.width, 
                paperRect.height + pageOffset);
    }
    
    /*
     * Scrollable methods
     */
    
    public Dimension getPreferredScrollableViewportSize() {
        Dimension screenSize = 
            getToolkit().getScreenSize(); 
        return new Dimension(
            screenSize.width / 3,
            screenSize.height / 3);
    }

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
        int value;
        
        switch (orientation) {
            case HORIZONTAL:
                value = visibleRect.width;
                break;

            default:
                assert orientation == VERTICAL : orientation;
                value = visibleRect.height;
        }

        return (int)(value * 0.10);
    }

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
        int value;
        
        switch (orientation) {
            case HORIZONTAL:
                value = visibleRect.width;
                break;

            default:
                assert orientation == VERTICAL : orientation;
                value = visibleRect.height;
        }

        return (int)(value * 0.25);
    }

    public boolean getScrollableTracksViewportWidth() {
        return false;
    }

    public boolean getScrollableTracksViewportHeight() {
        return false;
    }

    /*
     * Printable methods
     */
    
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        if (isPageNumberExists(pageIndex)) {
            setPageNumber(pageIndex);
            
            Graphics2D graphics2d = (Graphics2D) graphics;
            graphics2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
            
            print(graphics2d);
            
            return PAGE_EXISTS;
        }

        return NO_SUCH_PAGE;
    }

    /*
     * For testing
     */

    public static void main(String[] arguments) throws Throwable {
        JTextPane textPane = new JTextPane();
        
        textPane.setContentType("text/html");
        textPane.setText(
            "<html><body>" +
            "<p>Hello1</p>" +
            "<p>Hello2</p>" +
            "<p>Hello3</p>" +
            "<p>Hello4</p>" +
            "<p>Hello5</p>" +
            "<p>Hello6</p>" +
            "<p>Hello7</p>" +
            "<p>Hello8</p>" +
            "<p>Hello9</p>" +
            "<p>Hello10</p>" +
            "<p>Hello11</p>" +
            "<p>Hello12</p>" +
            "<p>Hello13</p>" +
            "<p>Hello14</p>" +
            "<p>Hello15</p>" +
            "<p>Hello16</p>" +
            "<p>Hello17</p>" +
            "<p>Hello18</p>" +
            "<p>Hello19</p>" +
            "<p>Hello20</p>" +
            "<p>Hello21</p>" +
            "<p>Hello22</p>" +
            "<p>Hello23</p>" +
            "<p>Hello24</p>" +
            "<p>Hello25</p>" +
            "<p>Hello26</p>" +
            "<p>Hello27</p>" +
            "<p>Hello28</p>" +
            "<p>Hello29</p>" +
            "<p>Hello30</p>" +
            "<p>Hello31</p>" +
            "<p>Hello32</p>" +
            "</body></html>");
        
        BorderLayout previewPaneLayout = new BorderLayout();
        JPanel previewPane = new JPanel(previewPaneLayout);
        
        final PrintPreviewPane preview = new PrintPreviewPane(textPane, PrinterJob.getPrinterJob().defaultPage());
        final JScrollPane scroll = new JScrollPane(preview);

        final PrinterJob printerJob = PrinterJob.getPrinterJob();

        preview.setPageFormat(printerJob.defaultPage());
        printerJob.setPrintable(preview, printerJob.defaultPage());
        
        JToolBar toolBar = new JToolBar();
        
        toolBar.add(new AbstractAction("Print") {
            public void actionPerformed(ActionEvent e) {
                if (printerJob.printDialog()) {
                    try {
                        printerJob.print();
                    } catch (PrinterException thrown) {
                        thrown.printStackTrace();
                    }
                }
            }
        });

        toolBar.add(new AbstractAction("Page +") {
            public void actionPerformed(ActionEvent e) {
                preview.setPageNumber(preview.getPageNumber() + 1);
            
                preview.revalidate();
                preview.repaint();
            }
        });
        toolBar.add(new AbstractAction("Page -") {
            public void actionPerformed(ActionEvent e) {
                preview.setPageNumber(preview.getPageNumber() - 1);
            
                preview.revalidate();
                preview.repaint();
            }
        });
        
        toolBar.add(new AbstractAction("Size +") {
            public void actionPerformed(ActionEvent e) {
                Dimension size = preview.getSize();
                
                preview.setPreferredSize(new Dimension(size.width + 10, size.height + 20));
                
                preview.revalidate();
                preview.repaint();

                scroll.getViewport().revalidate();
                scroll.getViewport().repaint();
            }
        });
        toolBar.add(new AbstractAction("Size -") {
            public void actionPerformed(ActionEvent e) {
                Dimension size = preview.getSize();
                
                preview.setPreferredSize(new Dimension(size.width - 10, size.height - 20));
                
                preview.revalidate();
                preview.repaint();
                
                scroll.getViewport().revalidate();
                scroll.getViewport().repaint();
            }
        });
        
        previewPane.add(scroll, BorderLayout.CENTER);
        previewPane.add(toolBar, BorderLayout.NORTH);
        
        JOptionPane.showMessageDialog(null, previewPane);

        System.exit(0);
    }

}

Только я ошибся насчет JTextArea, он с любым компонентом работает. И на страницы бъет довольно грубо - по размеру. 


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
cromm3
Дата 8.5.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 22.3.2006

Репутация: нет
Всего: нет



w1nd, спасибо! хороший пример. 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.