Files
pdf-xrechnung/lib/xmp.go
T

167 lines
3.6 KiB
Go

package lib
import (
xmpbase "github.com/trimmer-io/go-xmp/models/xmp_base"
"github.com/trimmer-io/go-xmp/xmp"
)
const (
FacturXNamespace = "Factur-X PDFA Erweiterungsschema"
FacturXUri = "urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#"
FacturXPrefix = "fx:"
)
type PDFAProperty struct {
Name string `xmp:"pdfaProperty:name"`
ValueType string `xmp:"pdfaProperty:valueType"`
Category string `xmp:"pdfaProperty:category"`
Description string `xmp:"pdfaProperty:description"`
}
type PDFASchema struct {
Schema string `xmp:"pdfaSchema:schema"`
NamespaceURI string `xmp:"pdfaSchema:namespaceURI"`
Prefix string `xmp:"pdfaSchema:prefix"`
Property []PDFAProperty `xmp:"pdfaSchema:property"`
}
type PDFAExtensionData struct {
Schemas [1]PDFASchema `xmp:"pdfaExtension:schemas,bag"`
}
type PDFAExtensionModel struct {
PDFAExtensionData
xmpbase.XmpBase
}
func (x PDFAExtensionModel) Can(nsName string) bool {
return nsName == "pdfaExtension"
}
func (x PDFAExtensionModel) Namespaces() xmp.NamespaceList {
return xmp.NamespaceList{
{
Name: "pdfaSchema",
URI: "http://www.aiim.org/pdfa/ns/schema#",
Factory: defaultFactory,
},
{
Name: "pdfaExtension",
URI: "http://www.aiim.org/pdfa/ns/extension/",
Factory: defaultFactory,
},
{
Name: "pdfaProperty",
URI: "http://www.aiim.org/pdfa/ns/property#",
Factory: defaultFactory,
},
}
}
func defaultFactory(name string) xmp.Model {
return nil
}
func addFacturXXmpData(data []byte) ([]byte, error) {
// --- Register Factur-X namespace ---
xmp.Register(&xmp.Namespace{
Name: "fx",
URI: FacturXUri,
Factory: defaultFactory,
})
doc := &xmp.Document{}
err := xmp.Unmarshal(data, doc)
if err != nil {
return nil, err
}
model := &PDFAExtensionModel{
PDFAExtensionData: PDFAExtensionData{
Schemas: [1]PDFASchema{
{
Schema: "Factur-X PDFA Extension Schema",
NamespaceURI: "urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#",
Prefix: "fx",
Property: []PDFAProperty{
{
Name: "DocumentType",
ValueType: "Text",
Category: "external",
Description: "Factur-X document type",
},
{
Name: "DocumentFileName",
ValueType: "Text",
Category: "external",
Description: "Attached XML file name",
},
{
Name: "Version",
ValueType: "Text",
Category: "external",
Description: "Factur-X version",
},
{
Name: "ConformanceLevel",
ValueType: "Text",
Category: "external",
Description: "Factur-X profile",
},
},
},
},
},
}
_, err = doc.AddModel(model)
if err != nil {
return nil, err
}
doc.FindModel(&xmp.Namespace{
Name: "",
URI: "",
Factory: nil,
})
// --- Set Factur-X properties ---
err = doc.SetPath(xmp.PathValue{
Path: FacturXPrefix + "ConformanceLevel",
Namespace: FacturXUri,
Value: "EN 16931",
})
if err != nil {
return nil, err
}
err = doc.SetPath(xmp.PathValue{
Path: FacturXPrefix + "DocumentType",
Namespace: FacturXUri,
Value: "INVOICE",
})
if err != nil {
return nil, err
}
err = doc.SetPath(xmp.PathValue{
Path: FacturXPrefix + "DocumentFileName",
Namespace: FacturXUri,
Value: "factur-x.xml",
})
if err != nil {
return nil, err
}
err = doc.SetPath(xmp.PathValue{
Path: FacturXPrefix + "Version",
Namespace: FacturXUri,
Value: "1.0",
})
if err != nil {
return nil, err
}
return xmp.Marshal(doc)
}