public class Formular {
private PdfWriter writer;
private PdfReader reader;
private Document doc;
private PdfDocument pdf;
private PageSize ps;
private PdfPage page;
private PdfCanvas canvas;
private float xpunkt,ypunkt;
private String DEST;
private String SRC="rsc/BlankoRechnung.pdf";
private PdfAcroForm form;
private Rectangle pageSize;
private Map<String, PdfFormField> felder;
private float len;
private PdfFont font=null,bold;
private float rand=43f;
private boolean mail;
private String kunde,strasse,ort,rechnr,rechdat,netto,mwst;
private String,ende1,ende2;
private ArrayList orders;
private ArrayList<String>allFontsList=new ArrayList<String>();
private String fontPath=null;
private String AvenirBold,AvenirMedium,AvenirRegular;
public Formular(boolean mail,String DEST,ArrayList arr) {
// Nur, damit ich die Übersicht behalte
kunde=""+arr.get(0);
strasse=""+arr.get(1);
ort=""+arr.get(2);
rechnr=""+arr.get(3);
rechdat=""+arr.get(4);
orders=(ArrayList)arr.get(5);
netto=""+arr.get(6);
mwst=""+arr.get(7);
betrag=""+arr.get(8);
ende1=""+arr.get(9);
ende2=""+arr.get(10);
this.DEST=DEST;
this.mail=mail;
try {
writer = new PdfWriter(DEST);
if(mail) {
reader = new PdfReader(SRC);
pdf = new PdfDocument(reader,writer);
}else pdf = new PdfDocument(writer);
ps=PageSize.A4;
doc = new Document(pdf,ps);
doc.setMargins(20, 20, 20, 20);
if(iniFont()) manipulierePdf();
doc.close();
} catch (Exception e) {e.printStackTrace();}
}
private boolean iniFont() {
boolean fontOk=false;
java.net.URL fontUrl = this.getClass().getClassLoader().getResource("rsc/Avenir_Next.ttc");
if (fontUrl != null) {
fontOk=true;
fontPath=fontUrl.getPath();
AvenirBold=fontPath+",0";
AvenirMedium=fontPath+",5";
AvenirRegular=fontPath+",7";
try {
TrueTypeCollection ttcObject=new TrueTypeCollection(fontPath);
for(int i=0;i<ttcObject.getTTCSize();i++) {
FontProgram fontp=ttcObject.getFontByTccIndex(i);
FontNames namen=fontp.getFontNames();
allFontsList.add(namen.getFontName());
}
} catch (IOException e) {e.printStackTrace();}
} else {
new Messagebox("AvenirFonts nicht gefunden!","PDFs konnten nicht erstellt werden");
}
return fontOk;
}
private void setText(float xpos,float ypos,float schriftSize,String schrift,String txt) throws IOException{
canvas.beginText().setFontAndSize(PdfFontFactory.createFont(schrift), schriftSize)
.moveText(xpos, pageSize.getHeight() - ypos)
.showText(txt)
.endText();
}
private void setLine(float xpos,float ypos,float bigLen) throws IOException{
canvas.setStrokeColor(Color.BLACK)
.setLineWidth(.2f)
.moveTo(xpos, pageSize.getHeight() - ypos)
.lineTo(xpos+bigLen,pageSize.getHeight() - ypos).stroke();
}
private void manipulierePdf() throws IOException{
float ypos=0f;
ypos=154f;
PdfPage page = null;
if(mail) {
page = pdf.getPage(1);
pageSize = page.getPageSize();
}else {
page = pdf.addNewPage(ps);
pageSize = ps;
}
canvas = new PdfCanvas(page);
setText(85f,154f,11f,AvenirRegular,kunde);
ypos+=14F;
setText(85f,168f,11f,AvenirRegular,strasse);
ypos+=15F;
setText(85f,ypos,11f,AvenirRegular,ort);
String dateStr="Ort den "+rechdat;
float txtLen=getLen(dateStr,1);
float xpos=pageSize.getWidth()-txtLen-rand;
ypos=257F;
setText(xpos,ypos,11f,AvenirRegular,dateStr);
ypos=320f;
setText(85f,ypos,18f,AvenirMedium,"Rechnung");
setText(175f,ypos,11f,AvenirMedium,rechnr);
// Draw orders
ypos=345.5f;
boolean multiOrder=(orders.size()>1)?true:false;
float bigLen=0F;
for(Object o: orders) {
ArrayList order=(ArrayList)o;
ypos+=16.5F;
String posten=""+order.get(0);
String preis=""+order.get(1);
xpos=85f;
setText(xpos,ypos,11f,AvenirRegular,posten);
txtLen=getLen(preis,1);
if(txtLen>bigLen)bigLen=txtLen;
xpos=pageSize.getWidth()-txtLen-rand;
setText(xpos,ypos,11f,AvenirRegular,preis);
}
if(multiOrder) {
ypos+=8f;
bigLen+=12f;
xpos=pageSize.getWidth()-bigLen-rand;
setLine(xpos,ypos,bigLen);
ypos+=16.5f;
xpos=373f;
setText(xpos,ypos,11f,AvenirRegular,"Summe");
txtLen=getLen(netto,1);
if(txtLen>bigLen)bigLen=txtLen;
xpos=pageSize.getWidth()-txtLen-rand;
setText(xpos,ypos,11f,AvenirRegular,netto);
}
ypos+=24f;
xpos=373f;
setText(xpos,ypos,11f,AvenirRegular,"+ 19 % MwSt.");
String mst=mwst;
txtLen=getLen(mst,1);
xpos=pageSize.getWidth()-txtLen-rand;
setText(xpos,ypos,11f,AvenirRegular,mst);
ypos+=8f;
xpos=pageSize.getWidth()-bigLen-rand;
setLine(xpos,ypos,bigLen);
ypos+=16.5f;
xpos=373f;
setText(xpos,ypos,11f,AvenirBold,"Gesamtsumme");
String ges=""+betrag;
txtLen=getLen(ges,2);
xpos=pageSize.getWidth()-txtLen-rand;
setText(xpos,ypos,11f,AvenirBold,ges);
txtLen=getLen(ges,2);
if((txtLen+12f)>bigLen)bigLen=txtLen+12f;
xpos=pageSize.getWidth()-bigLen-rand;
ypos+=8f;
setLine(xpos,ypos,bigLen);
ypos+=4f;
setLine(xpos,ypos,bigLen);
ypos+=100f;
xpos=85f;
setText(xpos,ypos,11f,AvenirRegular,ende1);
ypos+=14f;
setText(xpos,ypos,11f,AvenirRegular,ende2);
//Draw watermark
Paragraph p = new Paragraph("Dummy-Rechnung").setFontSize(60);
canvas.saveState();
PdfExtGState gs1 = new PdfExtGState().setFillOpacity(0.2f);
canvas.setExtGState(gs1);
doc.showTextAligned(p,
pageSize.getWidth() / 2, pageSize.getHeight() / 2,
pdf.getPageNumber(page),
TextAlignment.CENTER, VerticalAlignment.MIDDLE, 45);
canvas.restoreState();
}
private String getDatum() {
LocalDate localDate = LocalDate.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
return new String("Aßling, den "+localDate.format(formatter));
}
private float getLen(String txt,int schrift) {
PdfFont font;
float t=0.0f;
try {
if(schrift==2)font = PdfFontFactory.createFont(AvenirBold, true);
else font = PdfFontFactory.createFont(AvenirRegular, true);
GlyphLine glyphLine = font.createGlyphLine(txt);
int width = 0;
for (int i = 0; i < glyphLine.size(); i++){
Glyph glyph = glyphLine.get(i);
width += glyph.getWidth();
}
t = width * 11.0f / 1000.0f;
} catch (IOException e) {e.printStackTrace();}
return t;
}
public static void viewPdf(String datei) {
try {
Desktop desktop = Desktop.getDesktop();
if (desktop != null && desktop.isSupported(Desktop.Action.OPEN)) {
desktop.open(new File(datei));
} else {
System.err.println("PDF-Datei kann nicht angezeigt werden!");
}
} catch (IOException ex) {ex.printStackTrace();}
}
}