svn-gvsig-desktop / trunk / org.gvsig.desktop / org.gvsig.desktop.plugin / org.gvsig.app / org.gvsig.app.mainplugin / src / main / java / org / gvsig / app / project / documents / gui / PDFViewerWindow.java @ 44502
History | View | Annotate | Download (16.6 KB)
1 | 40558 | jjdelcerro | /**
|
---|---|---|---|
2 | * gvSIG. Desktop Geographic Information System.
|
||
3 | 40435 | jjdelcerro | *
|
4 | 40558 | jjdelcerro | * Copyright (C) 2007-2013 gvSIG Association.
|
5 | *
|
||
6 | 40435 | jjdelcerro | * This program is free software; you can redistribute it and/or
|
7 | * modify it under the terms of the GNU General Public License
|
||
8 | 40558 | jjdelcerro | * as published by the Free Software Foundation; either version 3
|
9 | 40435 | jjdelcerro | * of the License, or (at your option) any later version.
|
10 | 40558 | jjdelcerro | *
|
11 | 40435 | jjdelcerro | * This program is distributed in the hope that it will be useful,
|
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
14 | * GNU General Public License for more details.
|
||
15 | 40558 | jjdelcerro | *
|
16 | 40435 | jjdelcerro | * You should have received a copy of the GNU General Public License
|
17 | * along with this program; if not, write to the Free Software
|
||
18 | 40558 | jjdelcerro | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
19 | 40435 | jjdelcerro | * MA 02110-1301, USA.
|
20 | 40558 | jjdelcerro | *
|
21 | * For any additional information, do not hesitate to contact us
|
||
22 | * at info AT gvsig.com, or visit our website www.gvsig.com.
|
||
23 | 40435 | jjdelcerro | */
|
24 | package org.gvsig.app.project.documents.gui; |
||
25 | |||
26 | import java.awt.BorderLayout; |
||
27 | import java.awt.Component; |
||
28 | import java.awt.Container; |
||
29 | import java.awt.Dimension; |
||
30 | import java.awt.FlowLayout; |
||
31 | import java.awt.Toolkit; |
||
32 | import java.awt.event.ActionEvent; |
||
33 | import java.awt.event.ActionListener; |
||
34 | import java.awt.print.PageFormat; |
||
35 | import java.awt.print.Paper; |
||
36 | import java.awt.print.PrinterException; |
||
37 | import java.awt.print.PrinterJob; |
||
38 | import java.beans.PropertyChangeEvent; |
||
39 | import java.beans.PropertyChangeListener; |
||
40 | import java.net.URL; |
||
41 | |||
42 | import javax.print.attribute.HashPrintRequestAttributeSet; |
||
43 | import javax.print.attribute.PrintRequestAttributeSet; |
||
44 | import javax.print.attribute.standard.PageRanges; |
||
45 | import javax.swing.ImageIcon; |
||
46 | import javax.swing.JButton; |
||
47 | import javax.swing.JLabel; |
||
48 | import javax.swing.JOptionPane; |
||
49 | import javax.swing.JPanel; |
||
50 | import javax.swing.JScrollPane; |
||
51 | import javax.swing.JTextField; |
||
52 | |||
53 | import org.jpedal.Display; |
||
54 | import org.jpedal.PdfDecoder; |
||
55 | import org.jpedal.exception.PdfException; |
||
56 | import org.jpedal.objects.PrinterOptions; |
||
57 | |||
58 | import org.gvsig.andami.PluginServices; |
||
59 | import org.gvsig.andami.ui.mdiManager.IWindow; |
||
60 | import org.gvsig.andami.ui.mdiManager.WindowInfo; |
||
61 | |||
62 | public class PDFViewerWindow extends JPanel implements IWindow, |
||
63 | PropertyChangeListener {
|
||
64 | |||
65 | private static final long serialVersionUID = 4022263653761949704L; |
||
66 | private WindowInfo m_viewInfo;
|
||
67 | private PdfDecoder pf;
|
||
68 | |||
69 | // private String viewerTitle="Visor PDF";
|
||
70 | private String currentFile = null; |
||
71 | private int currentPage = 1; |
||
72 | private final JLabel pageCounter1 = new JLabel(" " |
||
73 | + PluginServices.getText(this, "Pagina") + " "); |
||
74 | private JTextField pageCounter2 = new JTextField(4); |
||
75 | private JLabel pageCounter3 = |
||
76 | new JLabel(PluginServices.getText(this, "de")); |
||
77 | |||
78 | public PDFViewerWindow(String currentFile) { |
||
79 | super();
|
||
80 | initialize(currentFile); |
||
81 | } |
||
82 | |||
83 | private void initialize(String currentFile) { |
||
84 | |||
85 | pf = new PdfDecoder();
|
||
86 | this.currentFile = currentFile;
|
||
87 | // currentFile = "C:\\Cartografia\\prueba.pdf";
|
||
88 | |||
89 | try {
|
||
90 | // this opens the PDF and reads its internal details
|
||
91 | pf.openPdfFile(currentFile); |
||
92 | |||
93 | // these 2 lines opens page 1 at 100% scaling
|
||
94 | pf.decodePage(currentPage); |
||
95 | float scaling = (float) 1.5; |
||
96 | pf.setPageParameters(scaling, 1); // values scaling (1=100%). page |
||
97 | // number
|
||
98 | pf.setDisplayView(Display.SINGLE_PAGE, Display.DISPLAY_CENTERED); |
||
99 | } catch (Exception e) { |
||
100 | e.printStackTrace(); |
||
101 | } |
||
102 | |||
103 | // setup our GUI display
|
||
104 | initializeViewer(); |
||
105 | |||
106 | // set page number display
|
||
107 | pageCounter2.setText(currentPage + "");
|
||
108 | pageCounter3.setText(PluginServices.getText(this, "de") + " " |
||
109 | + pf.getPageCount() + " ");
|
||
110 | } |
||
111 | |||
112 | public void setCurrentFile(String currentFile) { |
||
113 | this.currentFile = currentFile;
|
||
114 | } |
||
115 | |||
116 | private void initializeViewer() { |
||
117 | |||
118 | Container cPane = this; |
||
119 | cPane.setLayout(new BorderLayout()); |
||
120 | |||
121 | // JButton open = initOpenBut();//setup open button
|
||
122 | Component[] itemsToAdd = initChangerPanel();// setup page display and |
||
123 | // changer
|
||
124 | |||
125 | JPanel topBar = new JPanel(); |
||
126 | topBar.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); |
||
127 | // topBar.add(pageChanger);
|
||
128 | for (int i = 0; i < itemsToAdd.length; i++) { |
||
129 | topBar.add(itemsToAdd[i]); |
||
130 | } |
||
131 | |||
132 | cPane.add(topBar, BorderLayout.NORTH);
|
||
133 | |||
134 | JScrollPane display = getJPaneViewer();// setup scrollpane with pdf |
||
135 | // display inside
|
||
136 | cPane.add(display, BorderLayout.CENTER);
|
||
137 | |||
138 | // pack();
|
||
139 | |||
140 | Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); |
||
141 | setSize(screen.width / 2, screen.height / 2); |
||
142 | // <start-13>
|
||
143 | // setLocationRelativeTo(null);//centre on screen
|
||
144 | // <end-13>
|
||
145 | setVisible(true);
|
||
146 | } |
||
147 | |||
148 | private Component[] initChangerPanel() { |
||
149 | |||
150 | Component[] list = new Component[12]; |
||
151 | |||
152 | /** back to page 1 */
|
||
153 | JButton start = new JButton(); |
||
154 | start.setBorderPainted(false);
|
||
155 | URL startImage =
|
||
156 | getClass().getResource( |
||
157 | "/org/jpedal/examples/simpleviewer/res/start.gif");
|
||
158 | start.setIcon(new ImageIcon(startImage)); |
||
159 | start.setToolTipText(PluginServices.getText(this, "primera_pagina")); |
||
160 | // currentBar1.add(start);
|
||
161 | list[0] = start;
|
||
162 | start.addActionListener(new ActionListener() { |
||
163 | |||
164 | public void actionPerformed(ActionEvent e) { |
||
165 | if (currentFile != null && currentPage != 1) { |
||
166 | currentPage = 1;
|
||
167 | try {
|
||
168 | pf.decodePage(currentPage); |
||
169 | pf.invalidate(); |
||
170 | repaint(); |
||
171 | } catch (Exception e1) { |
||
172 | System.err.println("back to page 1"); |
||
173 | e1.printStackTrace(); |
||
174 | } |
||
175 | |||
176 | // set page number display
|
||
177 | pageCounter2.setText(currentPage + "");
|
||
178 | } |
||
179 | } |
||
180 | }); |
||
181 | |||
182 | /** back 10 icon */
|
||
183 | JButton fback = new JButton(); |
||
184 | fback.setBorderPainted(false);
|
||
185 | URL fbackImage =
|
||
186 | getClass().getResource( |
||
187 | "/org/jpedal/examples/simpleviewer/res/fback.gif");
|
||
188 | fback.setIcon(new ImageIcon(fbackImage)); |
||
189 | fback |
||
190 | .setToolTipText(PluginServices.getText(this, "diez_paginas_atras")); |
||
191 | // currentBar1.add(fback);
|
||
192 | list[1] = fback;
|
||
193 | fback.addActionListener(new ActionListener() { |
||
194 | |||
195 | public void actionPerformed(ActionEvent e) { |
||
196 | if (currentFile != null && currentPage > 10) { |
||
197 | currentPage -= 10;
|
||
198 | try {
|
||
199 | pf.decodePage(currentPage); |
||
200 | pf.invalidate(); |
||
201 | repaint(); |
||
202 | } catch (Exception e1) { |
||
203 | System.err.println("back 10 pages"); |
||
204 | e1.printStackTrace(); |
||
205 | } |
||
206 | |||
207 | // set page number display
|
||
208 | pageCounter2.setText(currentPage + "");
|
||
209 | } |
||
210 | } |
||
211 | }); |
||
212 | |||
213 | /** back icon */
|
||
214 | JButton back = new JButton(); |
||
215 | back.setBorderPainted(false);
|
||
216 | URL backImage =
|
||
217 | getClass().getResource( |
||
218 | "/org/jpedal/examples/simpleviewer/res/back.gif");
|
||
219 | back.setIcon(new ImageIcon(backImage)); |
||
220 | back.setToolTipText(PluginServices.getText(this, "pagina_atras")); |
||
221 | // currentBar1.add(back);
|
||
222 | list[2] = back;
|
||
223 | back.addActionListener(new ActionListener() { |
||
224 | |||
225 | public void actionPerformed(ActionEvent e) { |
||
226 | if (currentFile != null && currentPage > 1) { |
||
227 | currentPage -= 1;
|
||
228 | try {
|
||
229 | pf.decodePage(currentPage); |
||
230 | pf.invalidate(); |
||
231 | repaint(); |
||
232 | } catch (Exception e1) { |
||
233 | System.err.println("back 1 page"); |
||
234 | e1.printStackTrace(); |
||
235 | } |
||
236 | |||
237 | // set page number display
|
||
238 | pageCounter2.setText(currentPage + "");
|
||
239 | } |
||
240 | } |
||
241 | }); |
||
242 | |||
243 | pageCounter2.setEditable(true);
|
||
244 | pageCounter2.addActionListener(new ActionListener() { |
||
245 | |||
246 | public void actionPerformed(ActionEvent a) { |
||
247 | |||
248 | String value = pageCounter2.getText().trim();
|
||
249 | int newPage;
|
||
250 | |||
251 | // allow for bum values
|
||
252 | try {
|
||
253 | newPage = Integer.parseInt(value);
|
||
254 | |||
255 | if ((newPage > pf.getPageCount()) | (newPage < 1)) { |
||
256 | return;
|
||
257 | } |
||
258 | |||
259 | currentPage = newPage; |
||
260 | try {
|
||
261 | pf.decodePage(currentPage); |
||
262 | pf.invalidate(); |
||
263 | repaint(); |
||
264 | } catch (Exception e) { |
||
265 | System.err.println("page number entered"); |
||
266 | e.printStackTrace(); |
||
267 | } |
||
268 | |||
269 | } catch (Exception e) { |
||
270 | JOptionPane.showMessageDialog(
|
||
271 | null,
|
||
272 | ">" + value + "< " |
||
273 | + PluginServices.getText(this, "valor_incorrecto") |
||
274 | + pf.getPageCount()); |
||
275 | } |
||
276 | |||
277 | } |
||
278 | |||
279 | }); |
||
280 | |||
281 | /** put page count in middle of forward and back */
|
||
282 | // currentBar1.add(pageCounter1);
|
||
283 | // currentBar1.add(new JPanel());//add gap
|
||
284 | // currentBar1.add(pageCounter2);
|
||
285 | // currentBar1.add(new JPanel());//add gap
|
||
286 | // currentBar1.add(pageCounter3);
|
||
287 | list[3] = pageCounter1;
|
||
288 | list[4] = new JPanel(); |
||
289 | list[5] = pageCounter2;
|
||
290 | list[6] = new JPanel(); |
||
291 | list[7] = pageCounter3;
|
||
292 | |||
293 | /** forward icon */
|
||
294 | JButton forward = new JButton(); |
||
295 | forward.setBorderPainted(false);
|
||
296 | URL fowardImage =
|
||
297 | getClass().getResource( |
||
298 | "/org/jpedal/examples/simpleviewer/res/forward.gif");
|
||
299 | forward.setIcon(new ImageIcon(fowardImage)); |
||
300 | forward.setToolTipText(PluginServices.getText(this, "pagina_delante")); |
||
301 | // currentBar1.add(forward);
|
||
302 | list[8] = forward;
|
||
303 | forward.addActionListener(new ActionListener() { |
||
304 | |||
305 | public void actionPerformed(ActionEvent e) { |
||
306 | if (currentFile != null && currentPage < pf.getPageCount()) { |
||
307 | currentPage += 1;
|
||
308 | try {
|
||
309 | pf.decodePage(currentPage); |
||
310 | pf.invalidate(); |
||
311 | repaint(); |
||
312 | } catch (Exception e1) { |
||
313 | System.err.println("forward 1 page"); |
||
314 | e1.printStackTrace(); |
||
315 | } |
||
316 | |||
317 | // set page number display
|
||
318 | pageCounter2.setText(currentPage + "");
|
||
319 | } |
||
320 | } |
||
321 | }); |
||
322 | |||
323 | /** fast forward icon */
|
||
324 | JButton fforward = new JButton(); |
||
325 | fforward.setBorderPainted(false);
|
||
326 | URL ffowardImage =
|
||
327 | getClass().getResource( |
||
328 | "/org/jpedal/examples/simpleviewer/res/fforward.gif");
|
||
329 | fforward.setIcon(new ImageIcon(ffowardImage)); |
||
330 | fforward.setToolTipText(PluginServices.getText(this,
|
||
331 | "10_paginas_delante"));
|
||
332 | // currentBar1.add(fforward);
|
||
333 | list[9] = fforward;
|
||
334 | fforward.addActionListener(new ActionListener() { |
||
335 | |||
336 | public void actionPerformed(ActionEvent e) { |
||
337 | if (currentFile != null && currentPage < pf.getPageCount() - 9) { |
||
338 | currentPage += 10;
|
||
339 | try {
|
||
340 | pf.decodePage(currentPage); |
||
341 | pf.invalidate(); |
||
342 | repaint(); |
||
343 | } catch (Exception e1) { |
||
344 | System.err.println("forward 10 pages"); |
||
345 | e1.printStackTrace(); |
||
346 | } |
||
347 | |||
348 | // set page number display
|
||
349 | pageCounter2.setText(currentPage + "");
|
||
350 | } |
||
351 | } |
||
352 | }); |
||
353 | |||
354 | /** goto last page */
|
||
355 | JButton end = new JButton(); |
||
356 | end.setBorderPainted(false);
|
||
357 | URL endImage =
|
||
358 | getClass().getResource( |
||
359 | "/org/jpedal/examples/simpleviewer/res/end.gif");
|
||
360 | end.setIcon(new ImageIcon(endImage)); |
||
361 | end.setToolTipText(PluginServices.getText(this, "ultima_pagina")); |
||
362 | // currentBar1.add(end);
|
||
363 | list[10] = end;
|
||
364 | end.addActionListener(new ActionListener() { |
||
365 | |||
366 | public void actionPerformed(ActionEvent e) { |
||
367 | if (currentFile != null && currentPage < pf.getPageCount()) { |
||
368 | currentPage = pf.getPageCount(); |
||
369 | try {
|
||
370 | pf.decodePage(currentPage); |
||
371 | pf.invalidate(); |
||
372 | repaint(); |
||
373 | } catch (Exception e1) { |
||
374 | System.err.println("forward to last page"); |
||
375 | e1.printStackTrace(); |
||
376 | } |
||
377 | |||
378 | // set page number display
|
||
379 | pageCounter2.setText(currentPage + "");
|
||
380 | } |
||
381 | } |
||
382 | }); |
||
383 | |||
384 | /** Print */
|
||
385 | JButton print = new JButton(); |
||
386 | print.setBorderPainted(false);
|
||
387 | URL printImage =
|
||
388 | getClass().getResource( |
||
389 | "/org/jpedal/examples/simpleviewer/res/print.gif");
|
||
390 | print.setIcon(new ImageIcon(printImage)); |
||
391 | print.setToolTipText(PluginServices.getText(this, "imprimir")); |
||
392 | // currentBar1.add(end);
|
||
393 | list[11] = print;
|
||
394 | print.addActionListener(new ActionListener() { |
||
395 | |||
396 | public void actionPerformed(ActionEvent e) { |
||
397 | printPDF(); |
||
398 | } |
||
399 | }); |
||
400 | return list;
|
||
401 | } |
||
402 | |||
403 | public void printPDF() { |
||
404 | PrinterJob printJob = PrinterJob.getPrinterJob(); |
||
405 | |||
406 | printJob.setPageable(pf); |
||
407 | // decode_pdf.setPageFormat(pf);
|
||
408 | |||
409 | /**
|
||
410 | * this additional functionality is available under printable interface
|
||
411 | */
|
||
412 | // setup default values to add into JPS
|
||
413 | PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); |
||
414 | aset.add(new PageRanges(1, pf.getPageCount())); |
||
415 | |||
416 | boolean printFile = printJob.printDialog(aset);
|
||
417 | |||
418 | // set page range
|
||
419 | PageRanges r = (PageRanges) aset.get(PageRanges.class); |
||
420 | if (r != null) { |
||
421 | try {
|
||
422 | PageFormat pformat = printJob.defaultPage();
|
||
423 | |||
424 | Paper paper = new Paper(); |
||
425 | paper.setSize(595, 842); // default A4 |
||
426 | paper.setImageableArea(43, 43, 545, 792); // actual print 'zone' |
||
427 | |||
428 | pformat.setPaper(paper); |
||
429 | |||
430 | // pageable provides a method getPageFormat(int p) - this method
|
||
431 | // allows it to be set by JPedal
|
||
432 | pf.setPageFormat(pformat); |
||
433 | pf.setPagePrintRange(r); |
||
434 | } catch (PdfException e) {
|
||
435 | // TODO Auto-generated catch block
|
||
436 | e.printStackTrace(); |
||
437 | } |
||
438 | } |
||
439 | |||
440 | /**
|
||
441 | * generic call to both Pageable and printable
|
||
442 | */
|
||
443 | if (printFile) {
|
||
444 | try {
|
||
445 | pf.setPrintPageScalingMode(PrinterOptions.PAGE_SCALING_FIT_TO_PRINTER_MARGINS); |
||
446 | printJob.print(); |
||
447 | } catch (PrinterException e) { |
||
448 | // TODO Auto-generated catch block
|
||
449 | e.printStackTrace(); |
||
450 | } |
||
451 | } |
||
452 | } |
||
453 | |||
454 | private JScrollPane getJPaneViewer() { |
||
455 | JScrollPane currentScroll = new JScrollPane(); |
||
456 | currentScroll |
||
457 | .setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
|
||
458 | currentScroll |
||
459 | .setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
|
||
460 | |||
461 | currentScroll.setViewportView(pf); |
||
462 | return currentScroll;
|
||
463 | } |
||
464 | |||
465 | public WindowInfo getWindowInfo() {
|
||
466 | if (m_viewInfo == null) { |
||
467 | m_viewInfo = new WindowInfo(WindowInfo.PALETTE);
|
||
468 | m_viewInfo.setMaximizable(true);
|
||
469 | m_viewInfo.setWidth(this.getWidth());
|
||
470 | m_viewInfo.setHeight(this.getHeight());
|
||
471 | m_viewInfo.setTitle(PluginServices.getText(this, "pdf_viewer")); |
||
472 | } |
||
473 | return m_viewInfo;
|
||
474 | } |
||
475 | |||
476 | public void propertyChange(PropertyChangeEvent arg0) { |
||
477 | // TODO Auto-generated method stub
|
||
478 | |||
479 | } |
||
480 | |||
481 | public Object getWindowProfile() { |
||
482 | // TODO Auto-generated method stub
|
||
483 | return WindowInfo.TOOL_PROFILE;
|
||
484 | } |
||
485 | |||
486 | } |