676 lines
18 KiB
JavaScript
676 lines
18 KiB
JavaScript
//import { PDFDocument, StandardFonts, rgb } from 'pdf-lib'
|
|
const { PDFDocument,StandardFonts,rgb } = require("pdf-lib");
|
|
|
|
const fs = require("fs")
|
|
|
|
|
|
let headerData = {
|
|
sender: "Federspiel Technology UG haftungsbeschränkt, Am Schwarzen Brack 14 26452 Sande",
|
|
recipient: {
|
|
name: "NOA Service GmbH",
|
|
contact: "Lena Kramer",
|
|
special: "Hinterm Haus",
|
|
address: "Oldenburger Str. 52",
|
|
city: "26340 Zetel"
|
|
},
|
|
info: {
|
|
invoiceNumber: "RE23-1409",
|
|
customerNumber: "10069",
|
|
invoiceDate: "15.09.2023",
|
|
dateOfPerformance: "31.08.2023",
|
|
contactPerson: "Florian Federspiel",
|
|
tel: "015755769509",
|
|
email: "f.federspiel@federspiel.tech"
|
|
},
|
|
title: "Rechnung-Nr. RE23-1409",
|
|
description: "BV: Stubbendränk 23, 26340 Zetel"
|
|
}
|
|
|
|
|
|
|
|
|
|
const getCoordinatesForPDFLib = (x ,y, page) => {
|
|
/*
|
|
* @param x the wanted X Parameter in Millimeters from Top Left
|
|
* @param y the wanted Y Parameter in Millimeters from Top Left
|
|
* @param page the page Object
|
|
*
|
|
* @returns x,y object
|
|
* */
|
|
|
|
|
|
let retX = x * 2.83
|
|
let retY = page.getHeight()-(y*2.83)
|
|
|
|
return {
|
|
x: retX,
|
|
y: retY
|
|
}
|
|
|
|
}
|
|
|
|
|
|
async function createPdf() {
|
|
fs.readFile("Briefpapier.pdf",async (err,file) => {
|
|
console.log(file)
|
|
|
|
const pdfDoc = await PDFDocument.create()
|
|
|
|
const font = await pdfDoc.embedFont(StandardFonts.Helvetica)
|
|
const fontBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold)
|
|
|
|
|
|
|
|
const backgroudPdf = await PDFDocument.load(file)
|
|
|
|
const firstPageBackground = await pdfDoc.embedPage(backgroudPdf.getPages()[0])
|
|
const secondPageBackground = await pdfDoc.embedPage(backgroudPdf.getPages()[1])
|
|
|
|
console.log("TEST")
|
|
const page1 = pdfDoc.addPage()
|
|
|
|
console.log(page1.getSize().width/2.83)
|
|
|
|
page1.drawPage(firstPageBackground, {
|
|
x: 0,
|
|
y: 0,
|
|
})
|
|
console.log(page1.getSize())
|
|
|
|
|
|
//Falzmarke 1
|
|
page1.drawLine({
|
|
start: getCoordinatesForPDFLib(0,105,page1),
|
|
end: getCoordinatesForPDFLib(7,105,page1),
|
|
thickness: 0.25,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})
|
|
|
|
//Lochmarke
|
|
page1.drawLine({
|
|
start: getCoordinatesForPDFLib(0,148.5,page1),
|
|
end: getCoordinatesForPDFLib(7,148.5,page1),
|
|
thickness: 0.25,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})
|
|
|
|
//Falzmarke 2
|
|
page1.drawLine({
|
|
start: getCoordinatesForPDFLib(0,210,page1),
|
|
end: getCoordinatesForPDFLib(7,210,page1),
|
|
thickness: 0.25,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})
|
|
|
|
|
|
/*page1.drawLine({
|
|
start: getCoordinatesForPDFLib(20,45,page1),
|
|
end: getCoordinatesForPDFLib(105,45,page1),
|
|
thickness: 0.5,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})*/
|
|
|
|
page1.drawText("Federspiel Technology UG haftungsbeschränkt, Am Schwarzen Brack 14 26452 Sande", {
|
|
...getCoordinatesForPDFLib(21,48, page1),
|
|
size:6,
|
|
color:rgb(0,0,0),
|
|
lineHeight:6,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
|
|
/*page1.drawLine({
|
|
start: getCoordinatesForPDFLib(20,50,page1),
|
|
end: getCoordinatesForPDFLib(105,50,page1),
|
|
thickness: 0.5,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})*/
|
|
|
|
|
|
|
|
|
|
page1.drawText(headerData.recipient.name, {
|
|
...getCoordinatesForPDFLib(21,55, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
page1.drawText(headerData.recipient.contact, {
|
|
...getCoordinatesForPDFLib(21,60, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
page1.drawText(headerData.recipient.special, {
|
|
...getCoordinatesForPDFLib(21,65, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
page1.drawText(headerData.recipient.address, {
|
|
...getCoordinatesForPDFLib(21,70, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
page1.drawText(headerData.recipient.city, {
|
|
...getCoordinatesForPDFLib(21,75, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
/*page1.drawLine({
|
|
start: getCoordinatesForPDFLib(20,90,page1),
|
|
end: getCoordinatesForPDFLib(105,90,page1),
|
|
thickness: 0.5,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})*/
|
|
|
|
|
|
//Rechts
|
|
|
|
/*page1.drawLine({
|
|
start: getCoordinatesForPDFLib(125,50,page1),
|
|
end: getCoordinatesForPDFLib(200,50,page1),
|
|
thickness: 0.5,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})*/
|
|
|
|
page1.drawText("Rechnungsnummer", {
|
|
...getCoordinatesForPDFLib(126,55, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText(headerData.info.invoiceNumber, {
|
|
y: getCoordinatesForPDFLib(126,55, page1).y,
|
|
x: getCoordinatesForPDFLib(126,55,page1).x + 210 - font.widthOfTextAtSize(headerData.info.invoiceNumber,10),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
page1.drawText("Kundennummer", {
|
|
...getCoordinatesForPDFLib(126,60, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText(headerData.info.customerNumber, {
|
|
y: getCoordinatesForPDFLib(126,60, page1).y,
|
|
x: getCoordinatesForPDFLib(126,60,page1).x + 210 - font.widthOfTextAtSize(headerData.info.customerNumber,10),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText("Belegdatum", {
|
|
...getCoordinatesForPDFLib(126,65, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText(headerData.info.invoiceDate, {
|
|
y: getCoordinatesForPDFLib(126,65, page1).y,
|
|
x: getCoordinatesForPDFLib(126,65,page1).x + 210 - font.widthOfTextAtSize(headerData.info.invoiceDate,10),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
page1.drawText("Leistungsdatum", {
|
|
...getCoordinatesForPDFLib(126,70, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText(headerData.info.dateOfPerformance, {
|
|
y: getCoordinatesForPDFLib(126,70, page1).y,
|
|
x: getCoordinatesForPDFLib(126,70,page1).x + 210 - font.widthOfTextAtSize(headerData.info.dateOfPerformance,10),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText("Ansprechpartner", {
|
|
...getCoordinatesForPDFLib(126,75, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText(headerData.info.contactPerson, {
|
|
y: getCoordinatesForPDFLib(126,75, page1).y,
|
|
x: getCoordinatesForPDFLib(126,75,page1).x + 210 - font.widthOfTextAtSize(headerData.info.contactPerson,10),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText("Telefon", {
|
|
...getCoordinatesForPDFLib(126,80, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText(headerData.info.tel, {
|
|
y: getCoordinatesForPDFLib(126,80, page1).y,
|
|
x: getCoordinatesForPDFLib(126,80,page1).x + 210 - font.widthOfTextAtSize(headerData.info.tel,10),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText("E-Mail", {
|
|
...getCoordinatesForPDFLib(126,85, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText(headerData.info.email, {
|
|
y: getCoordinatesForPDFLib(126,85, page1).y,
|
|
x: getCoordinatesForPDFLib(126,85,page1).x + 210 - font.widthOfTextAtSize(headerData.info.email,10),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
/*page1.drawLine({
|
|
start: getCoordinatesForPDFLib(125,90,page1),
|
|
end: getCoordinatesForPDFLib(200,90,page1),
|
|
thickness: 0.5,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})*/
|
|
|
|
//Title
|
|
|
|
/*page1.drawLine({
|
|
start: getCoordinatesForPDFLib(20,95,page1),
|
|
end: getCoordinatesForPDFLib(200,95,page1),
|
|
thickness: 0.5,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})*/
|
|
|
|
page1.drawText(headerData.title, {
|
|
...getCoordinatesForPDFLib(20,102, page1),
|
|
size:15,
|
|
color:rgb(0,0,0),
|
|
lineHeight:15,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
/*page1.drawLine({
|
|
start: getCoordinatesForPDFLib(20,105,page1),
|
|
end: getCoordinatesForPDFLib(200,105,page1),
|
|
thickness: 0.5,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})*/
|
|
|
|
page1.drawText(headerData.description, {
|
|
...getCoordinatesForPDFLib(20,112, page1),
|
|
size:15,
|
|
color:rgb(0,0,0),
|
|
lineHeight:15,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
/*page1.drawLine({
|
|
start: getCoordinatesForPDFLib(20,115,page1),
|
|
end: getCoordinatesForPDFLib(200,115,page1),
|
|
thickness: 0.5,
|
|
color: rgb(0,0,0),
|
|
opacity: 1
|
|
})*/
|
|
|
|
page1.drawRectangle({
|
|
...getCoordinatesForPDFLib(20,130, page1),
|
|
width: 180 * 2.83,
|
|
height: 8 * 2.83,
|
|
color: rgb(0,0,0),
|
|
opacity: 0.25
|
|
})
|
|
|
|
//Header
|
|
|
|
page1.drawText("Pos", {
|
|
...getCoordinatesForPDFLib(21,127, page1),
|
|
size:12,
|
|
color:rgb(0,0,0),
|
|
lineHeight:12,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font: fontBold
|
|
})
|
|
|
|
page1.drawText("Menge", {
|
|
...getCoordinatesForPDFLib(35,127, page1),
|
|
size:12,
|
|
color:rgb(0,0,0),
|
|
lineHeight:12,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font: fontBold
|
|
})
|
|
|
|
page1.drawText("Bezeichnung", {
|
|
...getCoordinatesForPDFLib(52,127, page1),
|
|
size:12,
|
|
color:rgb(0,0,0),
|
|
lineHeight:12,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font: fontBold
|
|
})
|
|
|
|
page1.drawText("Einheitspreis", {
|
|
...getCoordinatesForPDFLib(135,127, page1),
|
|
size:12,
|
|
color:rgb(0,0,0),
|
|
lineHeight:12,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font: fontBold
|
|
})
|
|
|
|
page1.drawText("Gesamt", {
|
|
y: getCoordinatesForPDFLib(25,127, page1).y,
|
|
x: getCoordinatesForPDFLib(25,127,page1).x + 490 - fontBold.widthOfTextAtSize("Gesamt",12),
|
|
size:12,
|
|
color:rgb(0,0,0),
|
|
lineHeight:12,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font: fontBold
|
|
})
|
|
|
|
//Pos 1
|
|
|
|
page1.drawText("1.001", {
|
|
...getCoordinatesForPDFLib(21,135, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText("40,00 Std", {
|
|
...getCoordinatesForPDFLib(35,135, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText("IT-Dienstleistung", {
|
|
...getCoordinatesForPDFLib(52,135, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font: fontBold
|
|
})
|
|
|
|
page1.drawText("Florian Federspiel 03.11.23 10.00 - 15.00 5h ", {
|
|
...getCoordinatesForPDFLib(52,142, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
})
|
|
|
|
page1.drawText("28,00 €", {
|
|
...getCoordinatesForPDFLib(135,135, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText("1.120,00 €", {
|
|
y: getCoordinatesForPDFLib(25,135, page1).y,
|
|
x: getCoordinatesForPDFLib(25,135,page1).x + 490 - font.widthOfTextAtSize("1.120,00 €",10),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
})
|
|
|
|
//Pos 2
|
|
|
|
page1.drawText("1.002", {
|
|
...getCoordinatesForPDFLib(21,149, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText("40,00 Std", {
|
|
...getCoordinatesForPDFLib(35,149, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText("IT-Dienstleistung", {
|
|
...getCoordinatesForPDFLib(52,149, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font: fontBold
|
|
})
|
|
|
|
page1.drawText("Florian Federspiel 03.11.23 10.00 - 15.00 5h ", {
|
|
...getCoordinatesForPDFLib(52,156, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
})
|
|
|
|
page1.drawText("28,00 €", {
|
|
...getCoordinatesForPDFLib(135,149, page1),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240
|
|
})
|
|
|
|
page1.drawText("1.120,00 €", {
|
|
y: getCoordinatesForPDFLib(25,149, page1).y,
|
|
x: getCoordinatesForPDFLib(25,149,page1).x + 490 - font.widthOfTextAtSize("1.120,00 €",10),
|
|
size:10,
|
|
color:rgb(0,0,0),
|
|
lineHeight:10,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
})
|
|
|
|
//Footer
|
|
|
|
page1.drawRectangle({
|
|
...getCoordinatesForPDFLib(20,200, page1),
|
|
width: 180 * 2.83,
|
|
height: 8 * 2.83,
|
|
color: rgb(0,0,0),
|
|
opacity: 0.25
|
|
})
|
|
|
|
page1.drawRectangle({
|
|
...getCoordinatesForPDFLib(20,216, page1),
|
|
width: 180 * 2.83,
|
|
height: 8 * 2.83,
|
|
color: rgb(0,0,0),
|
|
opacity: 0.25
|
|
})
|
|
|
|
page1.drawText("Nettobetrag", {
|
|
...getCoordinatesForPDFLib(21,197, page1),
|
|
size:11,
|
|
color:rgb(0,0,0),
|
|
lineHeight:11,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font: fontBold
|
|
})
|
|
|
|
page1.drawText("2.240,00 €", {
|
|
y: getCoordinatesForPDFLib(21,197, page1).y,
|
|
x: getCoordinatesForPDFLib(21,197,page1).x + 500 - fontBold.widthOfTextAtSize("2.240,00 €",11),
|
|
size:11,
|
|
color:rgb(0,0,0),
|
|
lineHeight:11,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font:fontBold
|
|
})
|
|
|
|
page1.drawText("zzgl. 19% MwSt", {
|
|
...getCoordinatesForPDFLib(21,205, page1),
|
|
size:11,
|
|
color:rgb(0,0,0),
|
|
lineHeight:11,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font: fontBold
|
|
})
|
|
|
|
page1.drawText("425,60 €", {
|
|
y: getCoordinatesForPDFLib(21,205, page1).y,
|
|
x: getCoordinatesForPDFLib(21,205,page1).x + 500 - fontBold.widthOfTextAtSize("425,60 €",11),
|
|
size:11,
|
|
color:rgb(0,0,0),
|
|
lineHeight:11,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font:fontBold
|
|
})
|
|
|
|
page1.drawText("Gesamtsumme", {
|
|
...getCoordinatesForPDFLib(21,213, page1),
|
|
size:11,
|
|
color:rgb(0,0,0),
|
|
lineHeight:11,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font: fontBold
|
|
})
|
|
|
|
page1.drawText("2.665,60 €", {
|
|
y: getCoordinatesForPDFLib(21,213, page1).y,
|
|
x: getCoordinatesForPDFLib(21,213,page1).x + 500 - fontBold.widthOfTextAtSize("2.665,60 €",11),
|
|
size:11,
|
|
color:rgb(0,0,0),
|
|
lineHeight:11,
|
|
opacity: 1,
|
|
maxWidth: 240,
|
|
font:fontBold
|
|
})
|
|
|
|
page1.drawText("Bitte überweisen Sie den Rechnungsbetrag unter Angabe der Rechnungsnummer im Verwendungszweck innerhalb von 10 Tagen auf das unten angegebene Konto. Wir bedanken uns für das entgegengebrachte Vertrauen und freuen uns auf eine weitere gute Zusammenarbeit.",{
|
|
...getCoordinatesForPDFLib(20,222, page1),
|
|
size: 10,
|
|
color: rgb(0,0,0),
|
|
lineHeight: 10,
|
|
opacity: 1,
|
|
maxWidth: 500
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*const page2 = pdfDoc.addPage()
|
|
|
|
page2.drawPage(secondPageBackground, {
|
|
x:0,
|
|
y:0
|
|
})*/
|
|
|
|
|
|
console.log("SAVING")
|
|
|
|
const pdfBytes = await pdfDoc.save()
|
|
|
|
fs.writeFile("test.pdf",pdfBytes, (err) => {
|
|
console.log(err)
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
createPdf() |