Dépôt officiel du code source de l'ERP OpenConcerto
Rev 156 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2011-2019 OpenConcerto, 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.openconcerto.erp.core.finance.accounting.report;
import org.openconcerto.erp.generationDoc.TemplateManager;
import org.openconcerto.ui.preferences.TemplateProps;
import java.awt.Color;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import javax.swing.JOptionPane;
import com.ibm.icu.text.SimpleDateFormat;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;
public abstract class PdfGenerator {
private int offsetX;
private int offsetY;
private int templateOffsetX;
private int templateOffsetY;
private PdfContentByte cb;
private Document document;
private BaseFont bf;
private BaseFont bfb;
private int width;
private Map<String, String> map;
private String fileNameIn;
private String fileNameOut;
private File directoryOut;
private File fOut;
public static void main(String[] args) {
new PdfGenerator_2033B().generateFrom(null);
}
PdfGenerator(String fileNameIn, String fileNameOut, String directoryOut) {
this.fileNameIn = fileNameIn;
this.fileNameOut = fileNameOut;
this.directoryOut = new File(directoryOut, String.valueOf(Calendar.getInstance().get(Calendar.YEAR)));
}
public void generateFrom(Map<String, String> m) {
try {
if (m == null) {
System.err.println(this + " : filling with defaults");
}
this.map = m;
init();
this.cb.beginText();
generate();
this.cb.endText();
this.document.close();
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "Impossible de générer le fichier.\nModèle PDF non trouvé : " + e.getMessage());
}
}
private void init() throws FileNotFoundException {
// we create a reader for a certain document
PdfReader reader = null;
PdfWriter writer = null;
try {
InputStream in = TemplateManager.getInstance().getTemplate(fileNameIn);
if (in == null) {
File defaultFile = new File("Configuration/Template/PDF/" + fileNameIn);
System.err.println("PdfGenerator.init() template " + fileNameIn + " not retrieved from TemplateManager");
if (defaultFile.exists()) {
in = new FileInputStream(defaultFile);
} else {
System.err.println("PdfGenerator.init() template " + defaultFile.getAbsolutePath() + " not found in program directory");
}
final String property = TemplateProps.getInstance().getProperty("LocationTemplate");
defaultFile = new File(property, fileNameIn);
if (defaultFile.exists()) {
in = new FileInputStream(defaultFile);
} else {
System.err.println("PdfGenerator.init() template " + defaultFile.getAbsolutePath() + " not found in template prefs directory");
}
if (in == null) {
throw new FileNotFoundException(fileNameIn);
}
}
reader = new PdfReader(in);
final Rectangle psize = reader.getPageSize(1);
psize.setRight(psize.getRight() - this.templateOffsetX);
psize.setTop(psize.getTop() - this.templateOffsetY);
this.width = (int) psize.getWidth();
int margin = 32;
this.document = new Document(psize, margin, margin, margin, margin);
if (!this.directoryOut.exists()) {
this.directoryOut.mkdirs();
}
final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
final String computedFileName = sdf.format(new Date()) + "-" + this.fileNameOut;
fOut = new File(this.directoryOut, computedFileName);
System.err.println("Creation du fichier " + fOut.getCanonicalPath());
writer = PdfWriter.getInstance(this.document, new FileOutputStream(fOut));
this.document.open();
this.cb = writer.getDirectContent();
this.document.newPage();
PdfImportedPage page1 = writer.getImportedPage(reader, 1);
this.cb.addTemplate(page1, -this.templateOffsetX, -this.templateOffsetY);
this.bf = BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.EMBEDDED);
this.bfb = BaseFont.createFont(BaseFont.TIMES_BOLD, BaseFont.CP1252, BaseFont.EMBEDDED);
} catch (FileNotFoundException fE) {
throw fE;
} catch (IOException | DocumentException e) {
throw new IllegalStateException(e);
} finally {
if (reader != null) {
reader.close();
}
}
}
public abstract void generate();
public File getGeneratedFile() {
return this.fOut;
}
protected void setOffset(int i, int j) {
this.offsetX = i;
this.offsetY = j;
}
protected void setTemplateOffset(int i, int j) {
this.templateOffsetX = i;
this.templateOffsetY = j;
}
protected void addSplittedText(String code, String string, int fromx, int y, double deltax) {
int x = fromx - this.offsetX - this.templateOffsetX;
y = y - this.offsetY - this.templateOffsetY;
boolean error = false;
String s = string;
if (this.map != null) {
s = this.map.get(code);
}
if (s == null) {
s = code;
error = true;
this.cb.setColorFill(Color.RED);
}
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
String sub = String.valueOf(c);
this.cb.showTextAligned(PdfContentByte.ALIGN_LEFT, sub, x, y, 0);
x += deltax;
}
if (error) {
this.cb.setColorStroke(Color.BLACK);
}
}
protected void setFontRoman(int i) {
this.cb.setFontAndSize(this.bf, i);
}
protected void setFontBold(int i) {
this.cb.setFontAndSize(this.bfb, i);
}
protected void addText(String code, String string, int i, int j) {
addText(code, string, i, j, 0);
}
protected void addText(String code, String string, int i, int j, int k) {
addText(PdfContentByte.ALIGN_LEFT, code, string, i, j, k);
}
protected void addTextRight(String code, String string, int i, int j) {
int a = PdfContentByte.ALIGN_RIGHT;
int k = 0;
if (this.map == null)
this.cb.showTextAligned(a, string, i, j, k);
else {
boolean error = false;
String s = this.map.get(code);
if (s == null) {
s = code;
error = true;
} else {
if (s.equalsIgnoreCase("-0.0")) {
s = "0.0";
}
s = insertCurrencySpaces(s);
}
this.cb.showTextAligned(a, s, i, j, k);
if (error) {
this.cb.setColorStroke(Color.BLACK);
}
}
}
private final void addText(int a, String code, String string, int i, int j, int k) {
if (this.map == null)
this.cb.showTextAligned(a, string, i, j, k);
else {
boolean error = false;
String s = this.map.get(code);
if (s == null) {
s = code;
error = true;
}
this.cb.showTextAligned(a, s, i, j, k);
if (error) {
this.cb.setColorStroke(Color.BLACK);
}
}
}
protected int getWidth() {
return this.width;
}
protected static String insertCurrencySpaces(String string) {
final StringBuilder s = new StringBuilder();
for (int i = string.length() - 1; i >= 0; i--) {
s.insert(0, string.charAt(i));
if ((i - string.length()) % 3 == 0) {
s.insert(0, " ");
}
}
return s.toString().trim();
}
}