CheckPDFTextAgainstXML

Methode (Function) · gibt Integer zurück

CheckPDFTextAgainstXML ist eine Methode der Klasse Aloaha_ZUGFeRD.XML im Aloaha ZUGFeRD SDK. Sie betrifft BT-112 (Rechnungsgesamtbetrag einschließlich Umsatzsteuer), BT-115 (Fälliger Zahlungsbetrag), BT-109 (Rechnungsgesamtbetrag ohne Umsatzsteuer), BT-110 (Gesamtbetrag der Umsatzsteuer).

Beschreibung (Originaltext der englischen SDK-Dokumentation): Rough plausibility check of a hybrid invoice PDF (ZUGFeRD / Factur-X / XRechnung): are grand total (BT-112), amount due (BT-115), net total (BT-109), VAT total (BT-110), invoice number (BT-1) and IBAN (BT-84) of the embedded XML also printed on the PDF pages? Legally the XML counts, but people usually read the PDF - a PDF that shows other values than the XML is a mistake or a fraud attempt.

Rückgabe: 1 = the payable amount of the XML is printed on the PDF and nothing contradicts; 2 = payable amount printed, but a warning (invoice number not printed, or the PDF prints another IBAN than the XML); 0 = neither grand total nor amount due are printed; -1 = not checkable (licence, file not found, no embedded XML, no text in the PDF such as a scan) - see PDFTextCheckReport and LastError

Hinweis: Rough check: a value counts as printed when it appears anywhere in the page text. Amounts are recognised in the usual print formats (1.234,56 / 1,234.56 / 1234,56 / 1 234,56). A scanned PDF without text gives -1, not 0. The check does not replace ValidateInvoicePDF and does not prove that PDF and XML are identical. It needs a licence like the validation functions. Available from version 11.0.0.19.

Deklaration

Public Function CheckPDFTextAgainstXML(ByVal PDFPath As String, Optional ByVal LicenseKey As String = "") As Integer

Parameter

NameTypPflichtBeschreibung
PDFPathStringerforderlichZUGFeRD / Factur-X / XRechnung PDF with embedded invoice XML
LicenseKeyStringoptional (Standard: "")Licence key (empty = the key already set)

Aufruf (VB.NET)

Dim alo As New Aloaha_ZUGFeRD.XML(Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile.comfort, False, "IHR-LIZENZSCHLUESSEL")
Dim PDFPath As String = ""
Dim ergebnis = alo.CheckPDFTextAgainstXML(PDFPath)

Aufruf (C#)

var zfStandard = Aloaha_ZUGFeRD.iXML.ZUGFeRDVersion.xInvoice;   // Optional ByRef im Konstruktor: in C# mit ref übergeben
var alo = new Aloaha_ZUGFeRD.XML(Aloaha_ZUGFeRD.iXML.ZUGFeRDProfile.comfort, false, "IHR-LIZENZSCHLUESSEL", ref zfStandard);
string pdfPath = "";
var ergebnis = alo.CheckPDFTextAgainstXML(pdfPath);

Vollständiges Beispiel (VB.NET)

' VB.NET (Konsolenanwendung, Verweis auf Aloaha_ZUGFeRD.dll)
' Rechnungseingang: Format prüfen, dann PDF und XML abgleichen
Module RechnungsEingang
    Sub Main()
        Dim key As String = "IHR-LIZENZSCHLUESSEL"
        Dim alo As New Aloaha_ZUGFeRD.XML(key)

        For Each datei As String In System.IO.Directory.GetFiles("C:\Eingang", "*.pdf")
            Dim name As String = System.IO.Path.GetFileNameWithoutExtension(datei)

            ' 1. Ist die Rechnung nach EN 16931 / XRechnung gültig?
            If Not alo.ValidateInvoicePDF(datei, key) Then
                System.IO.File.WriteAllText("C:\Klaerung\" & name & "_format.txt", alo.ValidationReport)
                Continue For
            End If

            ' 2. Stehen die Werte des XML auch auf den Seiten der PDF?
            Select Case alo.CheckPDFTextAgainstXML(datei, key)
                Case 1
                    Console.WriteLine(name & ": PDF und XML passen zusammen")
                Case 2
                    ' Betrag gedruckt, aber Rechnungsnummer oder IBAN weichen ab: ansehen
                    System.IO.File.WriteAllText("C:\Klaerung\" & name & "_abgleich.txt", alo.PDFTextCheckReport)
                Case 0
                    ' Betrag des XML steht nicht in der PDF: Zahlung sperren
                    System.IO.File.WriteAllText("C:\Gesperrt\" & name & "_abgleich.txt", alo.PDFTextCheckReport)
                Case Else
                    ' -1: nicht prüfbar (z. B. Scan ohne Text); Grund im Bericht bzw. in LastError
                    Console.WriteLine(name & ": " & alo.PDFTextCheckReport & " " & alo.LastError)
            End Select
        Next
    End Sub
End Module

Vollständiges Beispiel (C#)

// C# (Konsolenanwendung, Verweis auf Aloaha_ZUGFeRD.dll)
// Rechnungseingang: Format prüfen, dann PDF und XML abgleichen
using System;
using System.IO;

class RechnungsEingang
{
    static void Main()
    {
        string key = "IHR-LIZENZSCHLUESSEL";
        var standard = Aloaha_ZUGFeRD.iXML.ZUGFeRDVersion.xInvoice;   // Optional ByRef im Konstruktor: in C# mit ref
        var alo = new Aloaha_ZUGFeRD.XML(key, ref standard);

        foreach (string datei in Directory.GetFiles(@"C:\Eingang", "*.pdf"))
        {
            string name = Path.GetFileNameWithoutExtension(datei);

            // 1. Ist die Rechnung nach EN 16931 / XRechnung gültig?
            if (!alo.ValidateInvoicePDF(datei, key))
            {
                File.WriteAllText(@"C:\Klaerung\" + name + "_format.txt", alo.ValidationReport);
                continue;
            }

            // 2. Stehen die Werte des XML auch auf den Seiten der PDF?
            switch (alo.CheckPDFTextAgainstXML(datei, key))
            {
                case 1:
                    Console.WriteLine(name + ": PDF und XML passen zusammen");
                    break;
                case 2:   // Betrag gedruckt, aber Rechnungsnummer oder IBAN weichen ab: ansehen
                    File.WriteAllText(@"C:\Klaerung\" + name + "_abgleich.txt", alo.PDFTextCheckReport);
                    break;
                case 0:   // Betrag des XML steht nicht in der PDF: Zahlung sperren
                    File.WriteAllText(@"C:\Gesperrt\" + name + "_abgleich.txt", alo.PDFTextCheckReport);
                    break;
                default:  // -1: nicht prüfbar (z. B. Scan ohne Text)
                    Console.WriteLine(name + ": " + alo.PDFTextCheckReport + " " + alo.LastError);
                    break;
            }
        }
    }
}

Worauf es bei CheckPDFTextAgainstXML ankommt:

  • Rückgabe 1 = der Betrag des XML steht in der PDF, 2 = Betrag gedruckt, aber Rechnungsnummer fehlt oder die PDF druckt eine andere IBAN, 0 = weder Rechnungsbetrag (BT-112) noch Zahlbetrag (BT-115) stehen in der PDF, -1 = nicht prüfbar.
  • Den Bericht mit einer Zeile je verglichenem Wert liefert PDFTextCheckReport.
  • Es ist eine grobe Prüfung: Ein Wert gilt als gedruckt, wenn er irgendwo im Seitentext steht. Beträge werden in den üblichen Schreibweisen erkannt (1.234,56 – 1,234.56 – 1234,56 – 1 234,56).
  • Eine gescannte PDF ohne Text ergibt -1, nicht 0. Das ist kein Hinweis auf Betrug.
  • Die Prüfung ersetzt nicht ValidateInvoicePDF und nicht den Abgleich von USt-IdNr. und IBAN mit Ihren Stammdaten. Sie braucht eine Lizenz wie die Validierung und läuft lokal.

Hintergrund und Testergebnisse: PDF und XML einer E-Rechnung abgleichen. Verfügbar ab Version 11.0.0.19.

Business Terms (EN 16931)

Quelle: XML-Dokumentationskommentare des Aloaha ZUGFeRD SDK (xml.vb). Gleiche Signatur in VB6/VBA über COM. In C# werden ByRef-Parameter mit ref übergeben, VB-Eigenschaften mit Parametern heißen get_…/set_…, optionale Parameter können entfallen.