org.jopendocument.print.ODTPrinterXML Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jOpenDocument Show documentation
Show all versions of jOpenDocument Show documentation
jOpenDocument is a free library for developers looking to use
Open Document files without OpenOffice.org.
The newest version!
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008-2013 jOpenDocument, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU
* General Public License Version 3 only ("GPL").
* You may not use this file except in compliance with the License.
* You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html
* See the License for the specific language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*
*/
package org.jopendocument.print;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.io.File;
import javax.swing.JOptionPane;
import javax.swing.RepaintManager;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jopendocument.model.OpenDocument;
public class ODTPrinterXML extends ODTPrinter {
File f;
private static final boolean debug = false;
public ODTPrinterXML(OpenDocument doc) {
super(doc);
String path = doc.getZipFile().getName();
path = path + "p";
this.f = new File(path);
if (!this.f.exists()) {
JOptionPane.showMessageDialog(null, this.f.getAbsolutePath() + " n'existe pas.");
throw new IllegalStateException("Config file: " + path + " doesn't exist");
}
}
@Override
public int print(final Graphics g, final PageFormat pageFormat, final int pageIndex) throws PrinterException {
if (pageIndex >= this.renderer.getPrintedPagesNumber()) {
return (Printable.NO_SUCH_PAGE);
}
// Disable Double Buffering
final RepaintManager currentManager = RepaintManager.currentManager(this.renderer);
currentManager.setDoubleBufferingEnabled(false);
// Move to printable area
final Graphics2D g2d = (Graphics2D) g;
int dx = 0;
int dy = 0;
boolean centerX = false;
boolean centerY = false;
double ratio = 1f;
// Adapt zoom
SAXBuilder builder = new SAXBuilder();
try {
Document document = builder.build(this.f);
Element root = document.getRootElement();
Element offset = root.getChild("offset");
// Decalage
if (offset != null) {
final Attribute offsetXAttribute = offset.getAttribute("x");
if (offsetXAttribute != null) {
dx = offsetXAttribute.getIntValue();
}
final Attribute offsetYAttribute = offset.getAttribute("y");
if (offsetYAttribute != null) {
dy = offsetYAttribute.getIntValue();
}
}
// Centrage
Element center = root.getChild("center");
if (center != null) {
final Attribute centerXAttribute = center.getAttribute("horizontal");
if (centerXAttribute != null) {
centerX = centerXAttribute.getBooleanValue();
}
final Attribute centerYAttribute = center.getAttribute("vertical");
if (centerYAttribute != null) {
centerY = centerYAttribute.getBooleanValue();
}
}
// resize
Element resize = root.getChild("resize");
final Attribute ratioAttribute = resize.getAttribute("percent");
if (ratioAttribute != null) {
String s = ratioAttribute.getValue();
s = s.replace('%', ' ').trim();
ratio = Double.parseDouble(s) / 100;
if (ratio <= 0 || ratio > 1) {
throw new IllegalStateException("Ratio out of bound:" + s + "(should be > 0% and <= 100%");
}
}
final double maxPrintWidth = this.renderer.getPrintWidth();
final double pageWidth = pageFormat.getImageableWidth();
final double maxPrintHeight = this.renderer.getPrintHeight();
final double pageHeight = pageFormat.getImageableHeight();
System.out.println("Ratio:" + ratio);
final double resizeDocument1 = (maxPrintWidth) / (pageWidth * ratio);
// final double resizeDocument2 = (maxPrintHeight) / (pageHeight * ratio);
this.renderer.setIgnoreMargins(true);
// if (resizeDocument1 > resizeDocument2) {
System.err.println("resize factor " + resizeDocument1);
this.renderer.setResizeFactor(resizeDocument1);
// } else {
// System.err.println("resize factor " + resizeDocument2);
// this.renderer.setResizeFactor(resizeDocument2);
// }
if (centerX) {
dx += (pageWidth - this.renderer.getPrintWidthInPixel()) / 2;
}
if (centerY) {
dy += (pageHeight - this.renderer.getPrintHeightInPixel()) / 2;
}
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
if (debug) {
g2d.setColor(Color.RED);
g2d.drawRect(0, 0, (int) pageFormat.getImageableWidth(), (int) pageFormat.getImageableHeight() - 1);
}
g2d.translate(dx, dy);
if (debug) {
g2d.setColor(Color.YELLOW);
g2d.drawRect(0, 0, this.renderer.getPrintWidthInPixel() - 1, this.renderer.getPrintHeightInPixel() - 1);
}
this.renderer.setCurrentPage(pageIndex);
// Paint
this.renderer.paintComponent(g2d);
} catch (Exception e) {
// The DTD parsing failed
e.printStackTrace();
}
currentManager.setDoubleBufferingEnabled(true);
return (Printable.PAGE_EXISTS);
}
}