From 664e43cafe559bb9e5b60fae134b5623a80bec39 Mon Sep 17 00:00:00 2001 From: "d.breimaier" Date: Fri, 24 Apr 2026 17:27:30 +0200 Subject: [PATCH] =?UTF-8?q?zugpferd=20pr=C3=BCfungstool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SDL/Fakturierung/cAutomailversand.vb | 50 +++---- SDL/Fakturierung/cFakturierung.vb | 40 +++--- SDL/frmdynMailvorlage.Designer.vb | 2 + SDL/frmdynMailvorlage.vb | 11 +- .../frmKundenUebersichtZollRgDetails.vb | 62 ++++++++- .../DATENSERVER/cDATENSERVER.vb | 123 +++++++++++++++++- 6 files changed, 226 insertions(+), 62 deletions(-) diff --git a/SDL/Fakturierung/cAutomailversand.vb b/SDL/Fakturierung/cAutomailversand.vb index 511ba1ad..8fdbc829 100644 --- a/SDL/Fakturierung/cAutomailversand.vb +++ b/SDL/Fakturierung/cAutomailversand.vb @@ -5,7 +5,7 @@ Imports VERAG_PROG_ALLGEMEIN Public Class cAutomailversand - Sub sendMailSammelrechnung(_Rechnungsdatum As Date, SammelrechungArt As Integer, FirmaID As Integer, Optional KundenNr As Integer = -1, Optional mailoeffnen As Boolean = False) + Sub sendMailSammelrechnung(_Rechnungsdatum As Date, SammelrechungArt As Integer, FirmaID As Integer, Optional KundenNr As Integer = -1, Optional mailoeffnen As Boolean = False, Optional faktGruppe As String = "") Try Dim sql As New VERAG_PROG_ALLGEMEIN.SQL @@ -29,7 +29,7 @@ Public Class cAutomailversand LEFT JOIN tblKundenErweitert on tblKundenErweitert.kde_KundenNr = Rechnungsausgang.RechnungsKundenNr INNER JOIN Währungstabelle on LandKz = Rechnungsausgang.RechnungsLandKz WHERE Rechnungsausgang.Status IN (2) and Rechnungsausgang.Automailversand_sent is null And Rechnungsausgang.Firma_ID = '" & FirmaID & "' And Rechnungsausgang.Sammelrechnung = '" & SammelrechungArt & "' And CONVERT(DATE,Rechnungsausgang.Rechnungsdatum,104) = '" & _Rechnungsdatum.ToShortDateString & "' - and isnull(Rechnungsausgang.Automailversand,0) = 1 and RechnungsNr > 0 " & IIf(KundenNr > 0, " AND RechnungsKundenNr = " & KundenNr, "") & " + and isnull(Rechnungsausgang.Automailversand,0) = 1 and Rechnungsausgang.Automailversand_sent = NULL and RechnungsNr > 0 " & IIf(KundenNr > 0, " AND RechnungsKundenNr = " & KundenNr, "") & " GROUP BY RechnungsNr, RechnungsKundenNr,isnull(tblKundenErweitert.kde_keineMWSt,0),RechnungsLandKz, MitgliedslandEU ORDER BY RechnungsLandKz, RechnungsKundenNr" @@ -39,7 +39,7 @@ Public Class cAutomailversand LEFT JOIN tblKundenErweitert on tblKundenErweitert.kde_KundenNr = Rechnungsausgang.RechnungsKundenNr INNER JOIN Währungstabelle on LandKz = Rechnungsausgang.RechnungsLandKz WHERE Rechnungsausgang.Status IN (2) and Rechnungsausgang.Automailversand_sent is null And Rechnungsausgang.Firma_ID = '" & FirmaID & "' And Rechnungsausgang.Sammelrechnung = '" & SammelrechungArt & "' And CONVERT(DATE,Rechnungsausgang.Rechnungsdatum,104) = '" & _Rechnungsdatum.ToShortDateString & "' - and isnull(Rechnungsausgang.Automailversand,0) = 1 and RechnungsNr > 0 " & IIf(KundenNr > 0, " AND RechnungsKundenNr = " & KundenNr, "") & " + and isnull(Rechnungsausgang.Automailversand,0) = 1 and Rechnungsausgang.Automailversand_sent = NULL and RechnungsNr > 0 and FakturierungsGruppe = '" & faktGruppe & "'" & IIf(KundenNr > 0, " AND RechnungsKundenNr = " & KundenNr, "") & " GROUP BY RechnungsNr, RechnungsKundenNr,tblKundenErweitert.kde_SR_IM_EX ORDER BY RechnungsLandKz, RechnungsKundenNr" @@ -155,26 +155,31 @@ Public Class cAutomailversand Dim listPDFs As New List(Of String) Dim showError As Boolean = False + + showError = mailoeffnen 'bei MailÖffnen fehler anzeigen! + setEmailText(row, FirmaID, RechnungsNr, Mailsubject, HTMLMail, SammelrechungArt, dt, BelegartenNr) - If do_SR(row.Item("RechnungsKundenNr"), FirmaID, SammelrechungArt, Rechnungsdatum, RechnungsNr, DruckDatumZeit, MDMKopiedrucken, listPDFs,,,, showError, AbfertigungsNr) Then - loadAndSetAnhaenge(SR_DT, ATTACHMENTS, listPDFs) + If do_SR(row.Item("RechnungsKundenNr"), FirmaID, SammelrechungArt, Rechnungsdatum, RechnungsNr, DruckDatumZeit, MDMKopiedrucken, listPDFs,,,, showError, AbfertigungsNr, faktGruppe) Then + loadAndSetAnhaenge(SR_DT, ATTACHMENTS, listPDFs) - If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then Mailsubject &= " TEST" + If VERAG_PROG_ALLGEMEIN.cAllgemein.TESTSYSTEM Then Mailsubject &= " TEST" - If mailoeffnen Then - Dim Mail = createMail(Mailsubject, HTMLMail, ATTACHMENTS, MailTo, MailtoCC, MailtoBCC, FirmaID) - If setLog(SR_DT, row, FirmaID, SammelrechungArt, Rechnungsdatum,,,,,,, Mail) Then - Mail.Display() - End If + If mailoeffnen Then + Dim Mail = createMail(Mailsubject, HTMLMail, ATTACHMENTS, MailTo, MailtoCC, MailtoBCC, FirmaID) + If setLog(SR_DT, row, FirmaID, SammelrechungArt, Rechnungsdatum,,,,,,, Mail) Then + Mail.Display() + End If - Else + Else - Dim TextHTML = "" - TextHTML &= HTMLMail - TextHTML &= cFakturierung.getSignature("DE", FirmaID, True, True,,,,, True) - HTMLMail = "
" & TextHTML & "
" + Dim TextHTML = "" + TextHTML &= HTMLMail + TextHTML &= cFakturierung.getSignature("DE", FirmaID, True, True,,,,, True) + HTMLMail = "
" & TextHTML & "
" - If setLog(SR_DT, row, FirmaID, SammelrechungArt, Rechnungsdatum, ATTACHMENTS, Mailsubject, HTMLMail, MailTo, MailtoCC, MailtoBCC,,, FISKAL) Then + If setLog(SR_DT, row, FirmaID, SammelrechungArt, Rechnungsdatum, ATTACHMENTS, Mailsubject, HTMLMail, MailTo, MailtoCC, MailtoBCC,,, FISKAL) Then + + End If End If @@ -182,8 +187,6 @@ Public Class cAutomailversand End If - End If - Next Next @@ -267,7 +270,10 @@ Public Class cAutomailversand Dim HTMLMail As String = "" Dim listPDFs As New List(Of String) - Dim showError As Boolean = False + + 'Dim showError As Boolean = False + 'showError = mailoeffnen 'bei MailÖffnen fehler anzeigen! + setEmailText(r, FirmaID, RECHNUNG.RechnungsNr, Mailsubject, HTMLMail, RECHNUNG.Sammelrechnung, dt, RECHNUNG.BelegartenNr, SPEDBUCH, RECHNUNG) loadAndSetAnhaenge(dt, ATTACHMENTS, listPDFs, RECHNUNG, SPEDBUCH) @@ -470,10 +476,10 @@ Public Class cAutomailversand End Sub - Private Function do_SR(kdNr As Integer, FirmaID As Integer, Sammelrechnungsart As Integer, Rechnungsdatum As Date, lastAktuelle_RgNr As Integer, DruckDatumZeit As Date, Kopie As Boolean, listPDFs As List(Of String), Optional EinzelAnlagen As Boolean = False, Optional Sammelbericht As Boolean = True, Optional saveInThereFore As Boolean = False, Optional showError As Boolean = True, Optional AbfertigungsArt As String = "") + Private Function do_SR(kdNr As Integer, FirmaID As Integer, Sammelrechnungsart As Integer, Rechnungsdatum As Date, lastAktuelle_RgNr As Integer, DruckDatumZeit As Date, Kopie As Boolean, listPDFs As List(Of String), Optional EinzelAnlagen As Boolean = False, Optional Sammelbericht As Boolean = True, Optional saveInThereFore As Boolean = False, Optional showError As Boolean = True, Optional AbfertigungsArt As String = "", Optional faktGruppe As String = "") Dim RechnungsNrisSet As Boolean = False - RechnungsNrisSet = cFakturierung.doSAMMELRechnungsDruck(FirmaID, Sammelrechnungsart, Rechnungsdatum, Rechnungsdatum, "", EinzelAnlagen, Sammelbericht, kdNr, 4, listPDFs, "", lastAktuelle_RgNr, DruckDatumZeit, , , ,, ,, AbfertigungsArt, True, Kopie, True, saveInThereFore, showError) + RechnungsNrisSet = cFakturierung.doSAMMELRechnungsDruck(FirmaID, Sammelrechnungsart, Rechnungsdatum, Rechnungsdatum, "", EinzelAnlagen, Sammelbericht, kdNr, 4, listPDFs, "", lastAktuelle_RgNr, DruckDatumZeit,,,,,, faktGruppe, AbfertigungsArt, True, Kopie, True, saveInThereFore, showError) Return RechnungsNrisSet End Function diff --git a/SDL/Fakturierung/cFakturierung.vb b/SDL/Fakturierung/cFakturierung.vb index 1fda4478..66f8a5cb 100644 --- a/SDL/Fakturierung/cFakturierung.vb +++ b/SDL/Fakturierung/cFakturierung.vb @@ -1860,34 +1860,20 @@ Public Class cFakturierung Dim p As New GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport rpt.Run(False) p.NeverEmbedFonts = "" - 'p.Version = Section.PdfVersion.PDFA3b - NICHT AUSREICHEND FÜR ZUGFERD! AUSSERDEM WIR PROF-VERSION BENÖTIGT! + 'p.Version = GrapeCity.ActiveReports.Export.Pdf.Section.PdfVersion.PDFA3b '- NICHT AUSREICHEND FÜR ZUGFERD! AUSSERDEM WIR PROF-VERSION BENÖTIGT! + p.Version = GrapeCity.ActiveReports.Export.Pdf.Section.PdfVersion.Pdf17 p.Export(rpt.Document, tmpPath) - '------------------- WEGEN PDF/A3 - - 'Dim srcPdf = tmpPath - 'Dim dstPdf = "pdfa3.pdf" - 'Dim iccPath = "sRGB.icc" - - 'Dim reader As New iText.Kernel.Pdf.PdfReader(srcPdf) - 'Dim writer As New PdfWriter(dstPdf) - - 'Dim iccStream = New FileStream(iccPath, FileMode.Open, FileAccess.Read) - 'Dim icc = ICC_Profile.GetInstance(iccStream) - - 'Dim outputIntent As New PdfOutputIntent("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", iccStream) - - 'Dim pdf As New iText.Pdfa.PdfADocument(writer, iText.Kernel.Pdf.PdfAConformanceLevel.PDF_A_3B, outputIntent) - - 'pdf.Close() - - '------------------- WEGEN PDF/A3 - Dim Paramslist As New cParameterList(VERAG_PROG_ALLGEMEIN.cAllgemein.PROGID) Dim enableZugpferd = Paramslist.GET_PARAMETER_VALUE_BOOL("ZUGFeRD") If enableZugpferd Then - tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addAttachementToPDF(tmpPath, createZUGFeRD(True, Rechnung,), "ZUGFeRD-invoice.xml") + 'tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addAttachementToPDF(tmpPath, createZUGFeRD(True, Rechnung,), "ZUGFeRD-invoice.xml") + Dim pdfA = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.ConvertToPdfA3(tmpPath) + tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addZugferdXML(pdfA, createZUGFeRD(True, Rechnung,)) + + + Else Dim Zugferdpath = createZUGFeRD(True, Rechnung) @@ -2872,7 +2858,9 @@ Public Class cFakturierung Dim Paramslist As New cParameterList(VERAG_PROG_ALLGEMEIN.cAllgemein.PROGID) Dim enableZugpferd = Paramslist.GET_PARAMETER_VALUE_BOOL("ZUGFeRD") If enableZugpferd Then - tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addAttachementToPDF(tmpPath, createZUGFeRD(True, RECHNUNG,), "ZUGFeRD-invoice.xml") + 'tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addAttachementToPDF(tmpPath, createZUGFeRD(True, RECHNUNG,), "ZUGFeRD-invoice.xml") + Dim pdfA = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.ConvertToPdfA3(tmpPath) + tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.AddZugferdXml(tmpPath, createZUGFeRD(True, RECHNUNG,)) Else Dim Zugferdpath = createZUGFeRD(True, RECHNUNG) @@ -5365,7 +5353,8 @@ Public Class cFakturierung Dim Paramslist As New cParameterList(VERAG_PROG_ALLGEMEIN.cAllgemein.PROGID) Dim enableZugpferd = Paramslist.GET_PARAMETER_VALUE_BOOL("ZUGFeRD") If enableZugpferd Then - tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addAttachementToPDF(tmpPath, createZUGFeRD(False, Nothing, SammelrechnungsDT, , rpt), "ZUGFeRD-invoice.xml") + 'tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addAttachementToPDF(tmpPath, createZUGFeRD(False, Nothing, SammelrechnungsDT, , rpt), "ZUGFeRD-invoice.xml") + tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.AddZugferdXml(tmpPath, createZUGFeRD(False, Nothing, SammelrechnungsDT, , rpt)) Else Dim Zugferdpath = createZUGFeRD(False, Nothing, SammelrechnungsDT,, rpt) If Zugferdpath IsNot Nothing AndAlso Zugferdpath <> "" Then @@ -6060,7 +6049,8 @@ Public Class cFakturierung Dim Paramslist As New cParameterList(VERAG_PROG_ALLGEMEIN.cAllgemein.PROGID) Dim enableZugpferd = Paramslist.GET_PARAMETER_VALUE_BOOL("ZUGFeRD") If enableZugpferd Then - tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addAttachementToPDF(tmpPath, createZUGFeRD(False, Nothing, dt, rpt), "ZUGFeRD-invoice.xml") + 'tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.addAttachementToPDF(tmpPath, createZUGFeRD(False, Nothing, dt, rpt), "ZUGFeRD-invoice.xml") + tmpPath = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.AddZugferdXml(tmpPath, createZUGFeRD(False, Nothing, dt, rpt)) Else Dim Zugferdpath = createZUGFeRD(False, Nothing, dt, rpt) If Zugferdpath IsNot Nothing AndAlso Zugferdpath <> "" Then diff --git a/SDL/frmdynMailvorlage.Designer.vb b/SDL/frmdynMailvorlage.Designer.vb index 6854819c..554af8e8 100644 --- a/SDL/frmdynMailvorlage.Designer.vb +++ b/SDL/frmdynMailvorlage.Designer.vb @@ -361,6 +361,8 @@ Partial Class frmdynMailvorlagen Me.rtb_Emailtext.Size = New System.Drawing.Size(868, 307) Me.rtb_Emailtext.TabIndex = 22 Me.rtb_Emailtext.Text = "" + Me.rtb_Emailtext.WordWrap = False + Me.rtb_Emailtext.ScrollBars = RichTextBoxScrollBars.Both ' 'cbxFirmaChange ' diff --git a/SDL/frmdynMailvorlage.vb b/SDL/frmdynMailvorlage.vb index 7765b93f..bb3df839 100644 --- a/SDL/frmdynMailvorlage.vb +++ b/SDL/frmdynMailvorlage.vb @@ -291,7 +291,7 @@ Public Class frmdynMailvorlagen txtkonserve = New cTextkonserve(dgvMailvorlagen.SelectedRows(0).Cells("txt_id").Value) - rtb_Emailtext.Text = txtkonserve.txt_text + 'rtb_Emailtext.Text = txtkonserve.txt_text txtBezeichnung.Text = txtkonserve.txt_bezeichnung txtBetreff.Text = txtkonserve.txt_betreff cbxAktiv.Checked = txtkonserve.txt_dynMailvorlage @@ -474,12 +474,11 @@ Public Class frmdynMailvorlagen End Sub - Private Function insertlinebreaks(text As String) As String - - Return text.ToString.Replace(vbLf, "
" & vbLf) - + Private Function InsertLineBreaks(text As String) As String + Return text.Replace(vbCrLf, "
" & vbCrLf) _ + .Replace(vbLf, "
" & vbLf) _ + .Replace(vbCr, "
" & vbCr) End Function - Private Sub cbSendungsvermerk_CheckedChanged(sender As Object, e As EventArgs) Handles cbSendungsvermerk.CheckedChanged txtSendungsvermerk.Visible = cbSendungsvermerk.Checked diff --git a/SDL/kunden/frmKundenUebersichtZollRgDetails.vb b/SDL/kunden/frmKundenUebersichtZollRgDetails.vb index 4bd5d3d1..952020f9 100644 --- a/SDL/kunden/frmKundenUebersichtZollRgDetails.vb +++ b/SDL/kunden/frmKundenUebersichtZollRgDetails.vb @@ -1,6 +1,7 @@  -Imports System.Reflection Imports System.Globalization +Imports System.IO +Imports VERAG_PROG_ALLGEMEIN Public Class frmKundenUebersichtZollRgDetails Dim RK_ID As Integer = -1 @@ -140,7 +141,11 @@ Public Class frmKundenUebersichtZollRgDetails Console.WriteLine(output) Console.WriteLine(err) - If err <> "" Then MsgBox(err) + If err <> "" Then + Dim tmpPath_Report = VERAG_PROG_ALLGEMEIN.DATENVERVER_OPTIONS.getTMPPath("MUSTANG-REPORT", ".pdf", , False) + CreateValidationPdf(err, Path_temp, RK_ID, tmpPath_Report) + If tmpPath_Report <> "" Then Process.Start(tmpPath_Report) + End If End Using @@ -151,4 +156,57 @@ Public Class frmKundenUebersichtZollRgDetails End If End Sub + + Private Function ExtractMustangResult(log As String, Invoice_file As String, RK_ID As Integer) As String + + Dim pdfStatus = If(log.Contains("Parsed PDF:invalid"), "INVALID", "VALID") + Dim xmlStatus = If(log.Contains("XML:valid"), "VALID", "INVALID") + Dim FileInfo As New FileInfo(Invoice_file) + Dim Invoice As New cRechnungsausgang(RK_ID) + + Dim profile As String = "EN16931" + If log.Contains("EN16931") Then profile = "EN16931" + + Dim took As String = "" + Dim m = System.Text.RegularExpressions.Regex.Match(log, "Took:(\d+)ms") + If m.Success Then took = m.Groups(1).Value & " ms" + + Return $"ZUGFeRD VALIDATION RESULT" & vbCrLf & + $"--------------------------------" & vbCrLf & + $"PDF File : {FileInfo.Name}" & vbCrLf & + $"Invoice No : {Invoice.RechnungsNr}" & vbCrLf & + $"PDF Status : {pdfStatus}" & vbCrLf & + $"XML Status : {xmlStatus}" & vbCrLf & + $"Profile : {profile}" & vbCrLf & + $"Duration : {took}" + + End Function + + Public Sub CreateValidationPdf(log As String, Invoice_file As String, RK_ID As Integer, outputPath As String) + + Dim resultText = ExtractMustangResult(log, Invoice_file, RK_ID) + + Using fs As New FileStream(outputPath, FileMode.Create) + Using doc As New itextsharp.text.Document() + Dim writer = itextsharp.text.pdf.PdfWriter.GetInstance(doc, fs) + + doc.Open() + + Dim titleFont = itextsharp.text.FontFactory.GetFont("Arial", 14, itextsharp.text.Font.BOLD) + Dim bodyFont = itextsharp.text.FontFactory.GetFont("Arial", 10) + + doc.Add(New itextsharp.text.Paragraph("ZUGFeRD VALIDATION REPORT", titleFont)) + doc.Add(New itextsharp.text.Paragraph(" ")) + + Dim lines = resultText.Split(vbCrLf) + + For Each line In lines + doc.Add(New itextsharp.text.Paragraph(line, bodyFont)) + Next + doc.Close() + End Using + End Using + + End Sub + End Class \ No newline at end of file diff --git a/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb b/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb index 18b68ba3..083483d1 100644 --- a/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb +++ b/VERAG_PROG_ALLGEMEIN/DATENSERVER/cDATENSERVER.vb @@ -3,9 +3,12 @@ Imports System.Drawing Imports System.Drawing.Printing Imports System.IO Imports System.Net +Imports System.Text Imports System.Text.RegularExpressions Imports System.Windows.Forms +Imports DocumentFormat.OpenXml Imports iTextSharp.text.pdf +Imports Org.apache.pdfbox.pdmodel.graphics.color Imports Spire.Pdf Imports Spire.Pdf.Attachments Imports Spire.Pdf.Print @@ -1393,10 +1396,10 @@ Public Class cFormularManager For Each pdfPath As String In PDFFile - Using doc As New Spire.Pdf.PdfDocument(pdfPath) + Using doc As New Spire.Pdf.PdfDocument(pdfPath) - If doc.Pages.Count = 0 Then Continue For - Dim size = doc.Pages(0).Size + If doc.Pages.Count = 0 Then Continue For + Dim size = doc.Pages(0).Size If size.Width <= 10 OrElse size.Height <= 10 Then Continue For 'zu kleine Seiten überspringen ' --- Druckeinstellungen --- doc.PrintSettings.PrinterName = printerName @@ -1405,9 +1408,9 @@ Public Class cFormularManager doc.PrintSettings.SelectSinglePageLayout(PdfSinglePageScalingMode.FitSize, True) doc.Print() - End Using + End Using - Next + Next Catch ex As Exception VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name) @@ -2437,6 +2440,112 @@ Public Class DATENVERVER_OPTIONS End Function + Public Shared Function addZugferdXML(File As String, attPath As String) As String + Dim tempFile As String = File & ".tmp" + + Using reader As New PdfReader(File) + Using fs As New FileStream(tempFile, FileMode.Create) + Using stamper As New PdfStamper(reader, fs) + + Dim xmlBytes = System.IO.File.ReadAllBytes(attPath) + + Dim fileName As String = "factur-x.xml" + + Dim fspec = PdfFileSpecification.FileEmbedded( + stamper.Writer, + fileName, + fileName, + xmlBytes, + "application/xml", + Nothing, + 0 + ) + + fspec.Put(PdfName.AFRELATIONSHIP, New PdfName("Alternative")) + + stamper.Writer.AddFileAttachment("ZUGFeRD", fspec) + + Dim af As New PdfArray() + af.Add(fspec.Reference) + stamper.Writer.ExtraCatalog.Put(PdfName.AFRELATIONSHIP, af) + + + SetZugferdXmp(stamper, fileName) + + End Using + End Using + End Using + + System.IO.File.Delete(File) + System.IO.File.Move(tempFile, File) + + Return File + End Function + + + Public Shared Function ConvertToPdfA3(inputPdf As String) As String + + Dim tempFile As String = inputPdf & ".tmp" + + Dim reader As New PdfReader(inputPdf) + + Using fs As New FileStream(tempFile, FileMode.Create, FileAccess.Write) + Using stamper As New PdfStamper(reader, fs) + + ' ✔ DAS ist in iTextSharp 5 der einzig relevante PDF/A-Baustein + Dim iccPath As String = + "C:\Windows\System32\spool\drivers\color\sRGB Color Space Profile.icm" + + Dim icc = ICC_Profile.GetInstance(File.ReadAllBytes(iccPath)) + + stamper.Writer.SetOutputIntents( + "Custom", + "", + "http://www.color.org", + "sRGB IEC61966-2.1", + icc + ) + + stamper.Writer.PDFXConformance = PdfWriter.PDFX32002 + + End Using + End Using + + reader.Close() + + If File.Exists(inputPdf) Then File.Delete(inputPdf) + File.Move(tempFile, inputPdf) + + Return inputPdf + + End Function + + + Private Shared Sub SetZugferdXmp(stamper As PdfStamper, xmlFileName As String) + + Dim xmp As String = + "" & + "" & + "" & + "" & + "3" & + "B" & + "INVOICE" & + "" & xmlFileName & "" & + "2.1" & + "EN 16931" & + "" & + "" & + "" & + "" + + stamper.XmpMetadata = Encoding.UTF8.GetBytes(xmp) + + + End Sub + Public Shared Function addAttachementToPDF(File As String, attPath As String, Optional renameFile As String = "") As String Try @@ -2496,9 +2605,9 @@ Public Class barcodeToPdf Public width As Integer Public height As Integer Public onpage = 1 - Public rotate As Drawing.RotateFlipType = RotateFlipType.RotateNoneFlipNone + Public rotate As System.Drawing.RotateFlipType = RotateFlipType.RotateNoneFlipNone - Sub New(image As Image, x As Integer, y As Integer, width As Integer, height As Integer, onpage As Integer, rotate As Drawing.RotateFlipType) + Sub New(image As Image, x As Integer, y As Integer, width As Integer, height As Integer, onpage As Integer, rotate As System.Drawing.RotateFlipType) Me.image = image Me.x = x Me.y = y