diff --git a/Interfaces/ZUGFeRDInterface.vb b/Interfaces/ZUGFeRDInterface.vb index 9af7367f..4bea907a 100644 --- a/Interfaces/ZUGFeRDInterface.vb +++ b/Interfaces/ZUGFeRDInterface.vb @@ -209,10 +209,9 @@ Public Class ZUGFeRDInterface Catch ex As Exception _logger.Error(ex) End Try - Else - Return Nothing End If + Return Nothing End Function Public Function GetSerializedXMLContentFromFile(oFileInfo As FileInfo) As ZugferdResult diff --git a/Interfaces/ZUGFeRDInterface/PropertyValues.vb b/Interfaces/ZUGFeRDInterface/PropertyValues.vb index 7b2426c9..a7a11d4e 100644 --- a/Interfaces/ZUGFeRDInterface/PropertyValues.vb +++ b/Interfaces/ZUGFeRDInterface/PropertyValues.vb @@ -3,6 +3,7 @@ Imports System.Reflection Imports System.Text.RegularExpressions Imports System.Xml Imports DigitalData.Modules.Logging +Imports GdPicture.Internal.MSOfficeBinary.translator.Spreadsheet.XlsFileFormat.Records Imports GdPicture.Internal.MSOfficeBinary.translator.Tools Public Class PropertyValues @@ -225,9 +226,15 @@ Public Class PropertyValues ' This should hopefully show config errors If TypeOf oPropertyValue Is List(Of Object) Then - _logger.Warn("Item with specification [{0}] may be configured incorrectly", oTableColumn) + _logger.Warn("Item [{0}] may be configured incorrectly", oTableColumn) oPropertyValue = Nothing End If + + If IsComplexeObject(oPropertyValue) = True Then + _logger.Debug("Item Value [{0}] is complexe. cant be used.", oTableColumn) + oPropertyValue = Nothing + End If + End Select End If Catch ex As Exception @@ -593,8 +600,21 @@ Public Class PropertyValues firstElement = oList.FirstOrDefault() If firstElement IsNot Nothing AndAlso IsArray(firstElement) Then - ' Attachments sind Byte-Arrays und müssen umgewandelt werden - Return Convert.ToBase64String(firstElement) + Dim oStr As String + ' Array behandeln -> erstes Element nehmen + If TypeOf firstElement Is String() Then + Dim arr As String() = CType(firstElement, String()) + oStr = If(arr.Length > 0, arr(0), String.Empty) + Else + oStr = firstElement.ToString() + End If + + If IsBase64String(oStr) Then + ' Attachments sind Byte-Arrays und müssen umgewandelt werden + Return Convert.ToBase64String(firstElement) + Else + Return oStr + End If Else Return DoGetFinalPropValue(oList.First()) @@ -636,4 +656,40 @@ Public Class PropertyValues Return Regex.IsMatch(Prop, _indexPattern) End Function + Private Function IsComplexeObject(obj As Object) As Boolean + If obj Is Nothing Then Return False + + Dim t As Type = obj.GetType() + + ' Einfache Typen ausschließen + If t.IsPrimitive OrElse + t.IsEnum OrElse + t Is GetType(String) OrElse + t Is GetType(Decimal) OrElse + t Is GetType(DateTime) Then + Return False + End If + + ' Wenn es öffentliche Properties hat, ist es "komplex" + Return t.GetProperties().Length > 0 OrElse t.IsClass + End Function + + Function IsBase64String(str As String) As Boolean + If String.IsNullOrEmpty(str) Then Return False + + ' Base64 hat bestimmte Zeichen und meist Länge Vielfaches von 4 + If str.Length Mod 4 <> 0 Then Return False + + ' Regex-Check für gültige Base64-Zeichen + If Not System.Text.RegularExpressions.Regex.IsMatch(str, "^[A-Za-z0-9+/]*={0,2}$") Then + Return False + End If + + Try + Dim bytes As Byte() = Convert.FromBase64String(str) + Return True + Catch ex As FormatException + Return False + End Try + End Function End Class