Powershell itextSharp Zeilenumbruch
Moin zusammen,
ich habe vor mit Hilfe eines Powershellskriptes eine Email abzurufen und komplett inkl. Attachements als PDF zu speichern, da Thunderbird ums verrecken keine pdf Anhänge
automatisch drucken kann.
Ich arbeite mit Mailkit (Danke nochmal Uwe ) und iTextSharp.
Mit Mailkit extrahiere ich aus dem TextBody der Email eine von ID und speichere den Body zur automatisierten Verarbeitung als ID.TXT, und die Mail mit Attachements als ID.pdf.
Das funktioniert auch wunderbar - bis auf ein Problem :
itextsharp entfernt die Zeilenumbrüche aus dem mailBody . So erhalte ich eine fomatierte Textdatei aber eine unformatierte PDF.
Und viel mehr mache ich mit der txt auch nicht :
Da so ziemlich alle Tutorials in c# sind, ist es für mich grad schwer, die Lösung zu finden :/
Gruß Sascha
edit:
Mit Notepad++ wird [CR][LF] auch beim "aus der PDF" kopierten, unvollständigen Text angezeigt. Die Umbrüche sind also vorhanden, werden aber scheinbar nicht richtig interpretiert?
ich habe vor mit Hilfe eines Powershellskriptes eine Email abzurufen und komplett inkl. Attachements als PDF zu speichern, da Thunderbird ums verrecken keine pdf Anhänge
automatisch drucken kann.
Ich arbeite mit Mailkit (Danke nochmal Uwe ) und iTextSharp.
Mit Mailkit extrahiere ich aus dem TextBody der Email eine von ID und speichere den Body zur automatisierten Verarbeitung als ID.TXT, und die Mail mit Attachements als ID.pdf.
Das funktioniert auch wunderbar - bis auf ein Problem :
itextsharp entfernt die Zeilenumbrüche aus dem mailBody . So erhalte ich eine fomatierte Textdatei aber eine unformatierte PDF.
$pdfFile.Open()
$pdf_Content = $PdfWriter.directContent
$pdf_Content.saveState()
$pdf_Content.beginText()
#Textposition angeben :
$pdf_Content.SetTextMatrix(25,800)
$pdf_Content.setFontAndSize($CourierFont, 14)
# Text zufügen :
$pdf_Content.ShowText($m.TextBody)
$pdf_Content.endText()
$pdf_Content.restoreState()
$pdfFile.Close()
$FileStream.Close()
Und viel mehr mache ich mit der txt auch nicht :
$txtContent = $($DOWNLOADPATH + $m.TextBody.Substring(0,12)+".txt")
$m.TextBody | Add-content $txtContent
Da so ziemlich alle Tutorials in c# sind, ist es für mich grad schwer, die Lösung zu finden :/
Gruß Sascha
edit:
Mit Notepad++ wird [CR][LF] auch beim "aus der PDF" kopierten, unvollständigen Text angezeigt. Die Umbrüche sind also vorhanden, werden aber scheinbar nicht richtig interpretiert?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 572835
Url: https://administrator.de/contentid/572835
Ausgedruckt am: 25.11.2024 um 05:11 Uhr
14 Kommentare
Neuester Kommentar
So wie es aussieht, bastel ich grad "line to line", und sollte den PdfContentByte nutzen.
Nein musst du nicht dafür gibt es das Paragraph Object, dort den Text hineinschreiben und das Paragraph Element z.B. einem ColumnText-Object hinzufügen.https://api.itextpdf.com/iText5/5.5.9/com/itextpdf/text/Paragraph.html
Dann werden auch Zeilenumbrüche wie gehabt genutzt.
Servus.
Funktionsfähiges Beispiel (getestet)
Grüße Uwe
Funktionsfähiges Beispiel (getestet)
# ....
# neues PDF Dokument erstellen
$doc = [iTextSharp.text.Document]::new([iTextSharp.text.PageSize]::A4)
$writer = [iTextSharp.text.pdf.PdfWriter]::GetInstance($doc,[System.IO.File]::Create("E:\Pfad\test.pdf"))
$doc.Open()
# neuen Absatz erstellen
$p = New-Object iTextSharp.text.Paragraph
# font Stil und Größe festlegen
$font = [iTextSharp.text.pdf.BaseFont]::CreateFont([iTextSharp.text.pdf.BaseFont]::COURIER,[iTextSharp.text.pdf.BaseFont]::CP1252,[iTextSharp.text.pdf.BaseFont]::NOT_EMBEDDED)
$p.Font = $font
$p.Font.Size = 10
# Text dem Absatz hinzufügen
$p.Add($m.TextBody) | out-null
# ColumnText Rahmen erstellen, positionieren und den Absatz hinzufügen
$colText = New-Object iTextSharp.text.pdf.ColumnText $writer.DirectContent
$colText.SetSimpleColumn(20,20,$doc.PageSize.Width-20,$doc.PageSize.Height-20)
$colText.AddElement($p)
$colText.Go() | out-null
$doc.Close()
$writer.Close()
# ....
Hallo,
ohne die geringste Ahnung von "iTextSharp" zu haben (Ahnungslosigkeit ist immer eine gute Voraussetzung ;) ): Eine Eigenart von PowerShell ist ihre ganz besondere Vorliebe für Arrays. Ich weiß nicht, wo bzw. wie du "$m.TextBody" (das ist wohl dein Text?) herbekommst. Aber möglicherweise ist das kein String mit Zeilenumbrüchen, sondern ein Array von Strings ohne Zeilenumbrüche.
Beispiel mit get-content:
Konsequenterweise erzeugt "$lines | Add-Content foo2.txt" wiederum eine Datei mit mehreren Zeilen: Die Elemente des Arrays werden einzeln an Add-Content übergeben, das erzeugt dann für jedes Element eine Ausgabe (also jeweils einen eigenen Schreibvorgang) und beendet diese mit einen Zeilenumbruch. Wenn ich das richtig verstehe, enthält dein $txtContent ja Zeilenumbrüche; das könnte die Erklärung sein.
Grüße
Filipp
ohne die geringste Ahnung von "iTextSharp" zu haben (Ahnungslosigkeit ist immer eine gute Voraussetzung ;) ): Eine Eigenart von PowerShell ist ihre ganz besondere Vorliebe für Arrays. Ich weiß nicht, wo bzw. wie du "$m.TextBody" (das ist wohl dein Text?) herbekommst. Aber möglicherweise ist das kein String mit Zeilenumbrüchen, sondern ein Array von Strings ohne Zeilenumbrüche.
Beispiel mit get-content:
$lines = Get-Content .\foo.txt # Textdatei mit drei Zeilen
$lines.GetType().FullName
# => System.Object
$lines.Length
# => 3 #Anzahl der Zeilen in Datei bzw. Elemente im Array
$stringLines = $lines -join "`r`n"
$stringLines.GetType().FullName
# => System.String
$stringLines.Length
# => 49 #Anzahl der Zeichen in Textdatei bzw. String
Konsequenterweise erzeugt "$lines | Add-Content foo2.txt" wiederum eine Datei mit mehreren Zeilen: Die Elemente des Arrays werden einzeln an Add-Content übergeben, das erzeugt dann für jedes Element eine Ausgabe (also jeweils einen eigenen Schreibvorgang) und beendet diese mit einen Zeilenumbruch. Wenn ich das richtig verstehe, enthält dein $txtContent ja Zeilenumbrüche; das könnte die Erklärung sein.
Grüße
Filipp
Servus.
Nein, es ist ein reiner String, siehe
http://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_TextBody.htm
Und für alle weiteren die hier versuchen mit Vermutungen Ihr Glück zu suchen: Die Methode ShowText des ByteContent Objects supported keine Zeilenumbrüche, deswegen habe ich oben das Beispiel mit dem Paragraph Object gepostet, dieses unterstützt nämlich Multiline-Text!
Grüße Uwe
Zitat von @filippg:
Ich weiß nicht, wo bzw. wie du "$m.TextBody" (das ist wohl dein Text?) herbekommst. Aber möglicherweise ist das kein String mit Zeilenumbrüchen, sondern ein Array von Strings ohne Zeilenumbrüche.
Ich weiß nicht, wo bzw. wie du "$m.TextBody" (das ist wohl dein Text?) herbekommst. Aber möglicherweise ist das kein String mit Zeilenumbrüchen, sondern ein Array von Strings ohne Zeilenumbrüche.
Nein, es ist ein reiner String, siehe
http://www.mimekit.net/docs/html/P_MimeKit_MimeMessage_TextBody.htm
Und für alle weiteren die hier versuchen mit Vermutungen Ihr Glück zu suchen: Die Methode ShowText des ByteContent Objects supported keine Zeilenumbrüche, deswegen habe ich oben das Beispiel mit dem Paragraph Object gepostet, dieses unterstützt nämlich Multiline-Text!
Grüße Uwe
ich habe mich dann doch etwas zu früh grefreut
Irgendwie Off-Topic ?!