Tiff-Datei Multipage in SQL ablegen und wieder holen - als Multipage

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Tiff-Datei Multipage in SQL ablegen und wieder holen - als Multipage

    Neu

    Hallo zusammen,

    ich muss mich an euch wenden, da ich einfach nicht weiter komme.

    Mittels folgendem Programm kopiere ich eine Datei die per DragDrop auf die Form gezogen wird:

    VB.NET-Quellcode

    1. My.Computer.FileSystem.CopyFile(_Datei_AusDragDrop, _TempDaten)
    2. Dim _PE As New FileConvert_Posteingang_01
    3. _PE._DIDimage = _did
    4. _PE._DokQuelle = _TempDaten
    5. _PE.ShowDialog()


    In der anderen Form (FileConvert_Posteingang_01) soll dann folgendes passieren:

    1. ist es PDF soll es zu Tiff gewandelt werden
    2. Posteinfangsstempel in das Tif zeichnen

    zu 1 (dazu per NuGet das Spire.PDF installiert):

    VB.NET-Quellcode

    1. Friend _DIDimage As Integer
    2. Friend _DokQuelle As String
    3. ...
    4. Dim pdf As PdfDocument = New PdfDocument()
    5. pdf.LoadFromFile(_DokQuelle)
    6. Dim images As Image() = SaveAsImage(pdf)
    7. JoinTiffImages(images, _TempDaten, EncoderValue.CompressionNone)
    8. PictureBox1.Image = Image.FromFile(_TempDaten)


    dazugehörige Unter-Subs:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function SaveAsImage(ByVal document As PdfDocument) As Image()
    2. Dim images As Image() = New Image(document.Pages.Count - 1) {}
    3. For i As Integer = 0 To document.Pages.Count - 1
    4. images(i) = document.SaveAsImage(i)
    5. Next
    6. Return images
    7. End Function
    8. Private Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo
    9. Dim encoders As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders()
    10. For j As Integer = 0 To encoders.Length - 1
    11. If encoders(j).MimeType = mimeType Then Return encoders(j)
    12. Next
    13. Throw New System.Exception(mimeType & " mime type not found in ImageCodecInfo")
    14. End Function
    15. Private Sub JoinTiffImages(ByVal images As Image(), ByVal outFile As String, ByVal compressEncoder As EncoderValue)
    16. Dim enc As Encoder = Encoder.SaveFlag
    17. Dim ep As EncoderParameters = New EncoderParameters(2)
    18. ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.MultiFrame))
    19. ep.Param(1) = New EncoderParameter(Encoder.Compression, CLng(compressEncoder))
    20. Dim pages As Image = images(0)
    21. Dim frame As Integer = 0
    22. Dim info As ImageCodecInfo = GetEncoderInfo("image/tiff")
    23. For Each img As Image In images
    24. If frame = 0 Then
    25. pages = img
    26. pages.Save(outFile, info, ep)
    27. Else
    28. ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.FrameDimensionPage))
    29. pages.SaveAdd(img, ep)
    30. End If
    31. If frame = images.Length - 1 Then
    32. ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.Flush))
    33. pages.SaveAdd(ep)
    34. End If
    35. frame += 1
    36. Next
    37. End Sub



    zu 2 (Posteingangsstempel in Tiff zeichnen):

    VB.NET-Quellcode

    1. Private Sub PictureBox2_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox2.MouseUp
    2. Dim b As Bitmap = New Bitmap(_TempDaten) 'Picturebox1.Image
    3. Dim g As Graphics = Graphics.FromImage(b)
    4. g.DrawString("Dieses Dokument wurde durch den Sachbearbeiter: " & My.Settings.clm_benutzername & " am " & Date.Now.ToShortDateString & " bearbeitet/archiviert.", New Font("Aptos", 18, FontStyle.Bold), Brushes.Black, 10, 10)
    5. If cb_DruckDokIdImBeleg.Checked = True Then
    6. g.DrawString("DOKUMENTEN-ID. " & _DIDimage.ToString, New Font("Aptos", 8, FontStyle.Bold), Brushes.Black, 500, 10)
    7. End If
    8. If cb_PoststempelAufdrucken.Checked = True Then
    9. g.DrawString("POSTEINGANG", New Font("Aptos", 12, FontStyle.Bold), Brushes.Blue, CInt((_L_Pb2.X - _L_Pb1.X) * 1.9701), CInt((_L_Pb2.Y - _L_Pb1.Y) * 1.9701))
    10. g.DrawString(Date.Now.ToShortDateString, New Font("Aptos", 12, FontStyle.Bold), Brushes.Blue, CInt((_L_Pb2.X - _L_Pb1.X) * 1.9701) + 4, CInt((_L_Pb2.Y - _L_Pb1.Y) * 1.9701) + 14)
    11. End If
    12. PictureBox1.Image = b
    13. [b]PictureBox1.Image.Save(_ClmTempDaten, System.Drawing.Imaging.ImageFormat.Tiff) <<<<< ---- FEHLER[/b]
    14. End Sub



    Bis zum markierten Fehler scheint alles gut zu laufen, aber dann kommt die Fehlermeldung: System.Runtime.InteropServices.ExternalException: "Allgemeiner Fehler in GDI+."
    Als Anlage habe ich n Bild aus Fehlerdetails angehängt... InnerException ist Nothing...

    Allgemeiner Fehler kann nun für mich erst mal alles sein, da ich zum ersten mal mit Tiff's und Graphics arbeite.

    Vielleicht hat einer eine gute Idee? Oder fällt jemanden Fehler auf die ich gemacht habe?

    Für Rückantworten wäre ich sehr dankbar...

    Viele Grüße
    Michl

    *Topic verschoben*
    Bilder
    • Fehler.JPG

      85,5 kB, 1.271×316, 10 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Neu

    @-Franky- Danke für deine Antwort...

    Ich hatte es so auch schon mal versucht ...

    VB.NET-Quellcode

    1. PictureBox1.Image = b
    2. b.Dispose()
    3. PictureBox1.Image.Save(_ClmTempDaten)

    da kommt "Ungültiger Parameter"

    und so auch

    VB.NET-Quellcode

    1. PictureBox1.Image = b
    2. PictureBox1.Image.Save(_ClmTempDaten)
    3. b.Dispose()

    auch mit diesem Fehler: System.Runtime.InteropServices.ExternalException: "Allgemeiner Fehler in GDI+" >> wird ja danach erst freigegeben
    ...

    Habe es auch schon mal mit Image statt New Bitmap versucht...

    VB.NET-Quellcode

    1. Dim b As Image = Image.FromFile(_ClmTempDaten) 'Picturebox1.Image
    2. Dim g As Graphics = Graphics.FromImage(b)
    3. g.DrawString("Dieses Dokument wurde durch den Sachbearbeiter: " & My.Settings.clm_benutzername & " am " & Date.Now.ToShortDateString & " bearbeitet/archiviert.", New Font("Aptos", 18, FontStyle.Bold), Brushes.Black, 10, 10)
    4. If cb_DruckDokIdImBeleg.Checked = True Then
    5. g.DrawString("DOKUMENTEN-ID. " & _DIDimage.ToString, New Font("Aptos", 8, FontStyle.Bold), Brushes.Black, 500, 10)
    6. End If
    7. usw.......


    Da kommt genau der gleiche Fehler.

    Neu

    @michl75 Setze einen Haltepunkt auf die Zeile und sieh Dir den Inhalt der Variablen an.
    Irgend etwas ist da wohl Nothing.
    Lerne zu debuggen:
    Debuggen, Fehler finden und beseitigen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    Hi. Ok. Da gibt es für mich weitere Ungereimtheiten. Du weist b einer PB zu um dann PB.Image zu speichern. Da kannst doch gleich b.Save aufrufen. Dann erzeugst Du aus der PDF eine MultiFrame-TIFF und speicherst diese zuerst auf die Platte um diese später wieder von der Platte zu laden um vermutlich auf der ersten Seite den Stempel anzubringen. Dabei hast du schon in images alle Bilder. Bearbeite daraus das erste Bild und dann erst werden die einzelnen Bilder zu einer MultiFrame-TIFF zusammengefasst-> JoinTiffImages Wobei der Name der Sub ein wenig irreführend ist.
    Mfg -Franky-

    Neu

    -Franky- schrieb:

    Hi. Ok. Da gibt es für mich weitere Ungereimtheiten. Du weist b einer PB zu um dann PB.Image zu speichern. Da kannst doch gleich b.Save aufrufen. Dann erzeugst Du aus der PDF eine MultiFrame-TIFF und speicherst diese zuerst auf die Platte um diese später wieder von der Platte zu laden um vermutlich auf der ersten Seite den Stempel anzubringen. Dabei hast du schon in images alle Bilder. Bearbeite daraus das erste Bild und dann erst werden die einzelnen Bilder zu einer MultiFrame-TIFF zusammengefasst-> JoinTiffImages Wobei der Name der Sub ein wenig irreführend ist.


    So ... Sorry... Endlich fertig und wollte eben noch wenigstens kurz Antworten.

    Tatsächlich ist das alles noch recht durcheinander, liegt unteranderem daran, dass ich mich Stück für Stück dran gemacht hab.
    Habe bereits begonnen Das ohne "Zwischenspeichern" auf der Platte und erneut laden umzuschreiben bzw. zu korrigieren.
    Habe dazu

    VB.NET-Quellcode

    1. Private _Image as Image
    gesetzt und meine Picbox wird erst am Schluss mit neuen Daten versorgt.

    Was ich aber gern beibehalten möchte ist, dass die Ursprungsdatei beim übersetzen von DPF auf Tiff in mein temporäres Verzeichnis kopiert wird. Das wird auch einmal am Tag gelöscht, also kein Datenmüll...

    Ich werde ganz unten meinen "Versuchscode" mal komplett posten :)

    Worauf ich noch keine Lösung habe ist...

    VB.NET-Quellcode

    1. If _FileInfo.Extension = ".pdf" Or _FileInfo.Extension = ".PDF" Then
    2. Dim pdf As PdfDocument = New PdfDocument()
    3. pdf.LoadFromFile(_DokQuelle)
    4. [b]Dim images As Image() = SaveAsImage(pdf)
    5. JoinTiffImages(images, TextBox1.Text, EncoderValue.CompressionLZW)[/b]
    6. Using tiff As Stream = New FileStream(TextBox1.Text, FileMode.Open, FileAccess.Read, FileShare.Read)
    7. Dim _b As Image = Image.FromStream(tiff)
    8. Dim _g As Graphics = Graphics.FromImage(_b)
    9. PictureBox1.Image = _b
    10. _Image = _b
    11. _g.Dispose()
    12. End Using

    Ich würde gerne ab dem images bereits die Daten in mein _Image für die weitere Bearbeitung bereitstellen. Hier ist aber das Images als Array vorhanden ...
    Außerdem ist mir aufgefallen, dass meine auf der Platte gespeicherte Datei mehrere Seiten hat, was aber bei mir im _Image liegt ist nur die erste Seite...



    So nun auch hier mal der Gesamte Code. Bin mir sicher, das man das viel besser machen kann als mein Versuch derzeit ist :)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.ComponentModel
    3. Imports System.IO
    4. Imports System.Drawing
    5. Imports System.Drawing.Imaging
    6. Imports Tesseract
    7. Imports Spire.Pdf
    8. Public Class FileConvert_Posteingang_01
    9. Friend _DIDimage As Integer
    10. Friend _DokQuelle As String
    11. Private _nV As Single = 0
    12. Private _nH As Single = 0
    13. Private _nW As Single = 0
    14. Private tessdataPath As String = Windows.Forms.Application.StartupPath.Replace("\bin\Debug", "") + Path.DirectorySeparatorChar & "\Archiv\tessdata"
    15. Private _Image As Image
    16. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    17. Me.Text = "Verwaltung mit Dokumentenanbindung - Vers. " & My.Application.Info.Version.ToString
    18. tslbl_benutzername_system.Text = Environment.UserName.ToString
    19. If My.Settings.clm_benutzer_isadmin = True Then
    20. txb_faktor_X.Enabled = True
    21. txb_faktor_Y.Enabled = True
    22. End If
    23. DatenLaden()
    24. End Sub
    25. #Region "DatenLaden und Verarbeitung bzw. Hauptconvertierung"
    26. Private Sub DatenLaden()
    27. Dim _FileInfo As FileInfo
    28. _FileInfo = New FileInfo(_DokQuelle)
    29. Dim _Speichercode1 As String = Nothing
    30. NeuerVorgangCode1:
    31. _Speichercode1 = getrandombystring("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 12)
    32. If CDec(Archiv_Dokumentenstam_BinardatenPDFTableAdapter.ScalarQuery_SPEICHERCODEPRUEFUNG_nachSpeichercode(_Speichercode1)) > 0 Then
    33. GoTo NeuerVorgangCode1
    34. End If
    35. Dim _ClmTempDaten_Pfad As String = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\CLM_TempFile\"
    36. Dim _ClmTempDaten_Dateiname As String = "MSCLM_DC_" & _DIDimage.ToString("0000000") & "_" & _Speichercode1 & ".Tiff"
    37. 'Dim _ClmTempDaten As String = _ClmTempDaten_Pfad & _ClmTempDaten_Dateiname
    38. TextBox1.Text = _ClmTempDaten_Pfad & _ClmTempDaten_Dateiname
    39. If _FileInfo.Extension = ".pdf" Or _FileInfo.Extension = ".PDF" Then
    40. Dim pdf As PdfDocument = New PdfDocument()
    41. pdf.LoadFromFile(_DokQuelle)
    42. Dim images As Image() = SaveAsImage(pdf)
    43. JoinTiffImages(images, TextBox1.Text, EncoderValue.CompressionLZW)
    44. Using tiff As Stream = New FileStream(TextBox1.Text, FileMode.Open, FileAccess.Read, FileShare.Read)
    45. Dim _b As Image = Image.FromStream(tiff)
    46. Dim _g As Graphics = Graphics.FromImage(_b)
    47. PictureBox1.Image = _b
    48. _Image = _b
    49. _g.Dispose()
    50. End Using
    51. ElseIf _FileInfo.Extension = ".tiff" Or _FileInfo.Extension = ".Tiff" Or _FileInfo.Extension = ".tif" Or _FileInfo.Extension = ".Tif" Then
    52. ElseIf _FileInfo.Extension = ".xps" Or _FileInfo.Extension = ".XPS" Then
    53. Else
    54. MessageBox.Show("Die übergebene Datei hat ein Format, dass nicht gelesen werden kann. Bitte in ein Lesbares Format umwandeln, empfohlen wird: Tiff oder PDF. In der Datenbank werden die Daten als Tiff abgelegt.", "STOP der Verarbeitung", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    55. Exit Sub
    56. End If
    57. txb_faktor_X.Text = My.Settings.archiv_faktor_stempelberechnungX.ToString("N4")
    58. txb_faktor_Y.Text = My.Settings.archiv_faktor_stempelberechnungY.ToString("N4")
    59. lbl_Bildaufloesung.Text = "Höhe: " & PictureBox1.Image.PhysicalDimension.Height.ToString & " Breite: " & PictureBox1.Image.PhysicalDimension.Width.ToString
    60. lbl_fenstergroesse.Text = "Höhe: " & PictureBox1.Height.ToString & " Breite: " & PictureBox1.Width.ToString
    61. Dim _Verhaeltnis_H As Double = CDbl(PictureBox1.Image.PhysicalDimension.Height / PictureBox1.Height)
    62. Dim _Verhaeltnis_W As Double = CDbl(PictureBox1.Image.PhysicalDimension.Width / PictureBox1.Width)
    63. _nV = CInt((_Verhaeltnis_H + _Verhaeltnis_W) / 2)
    64. lbl_BilderVerhaeltnis.Text = _Verhaeltnis_H.ToString("N4") & " / " & _Verhaeltnis_W.ToString("N4")
    65. _nH = 297 / PictureBox1.Image.PhysicalDimension.Height
    66. _nW = 210 / PictureBox1.Image.PhysicalDimension.Width
    67. lbl_MmPixel.Text = "Höhe: " & _nH.ToString("N4") & " Breite: " & _nW.ToString("N4")
    68. PictureBox2.Size = New Size(CInt((29 * _Verhaeltnis_H) - 5), CInt((16 * _Verhaeltnis_W)) - 5)
    69. tslbl_PS.Text = "nein"
    70. End Sub
    71. Private Function SaveAsImage(ByVal document As PdfDocument) As Image()
    72. Dim images As Image() = New Image(document.Pages.Count - 1) {}
    73. For i As Integer = 0 To document.Pages.Count - 1
    74. images(i) = document.SaveAsImage(i)
    75. Next
    76. Return images
    77. End Function
    78. Private Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo
    79. Dim encoders As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders()
    80. For j As Integer = 0 To encoders.Length - 1
    81. If encoders(j).MimeType = mimeType Then Return encoders(j)
    82. Next
    83. Throw New System.Exception(mimeType & " mime type not found in ImageCodecInfo")
    84. End Function
    85. Private Sub JoinTiffImages(ByVal images As Image(), ByVal outFile As String, ByVal compressEncoder As EncoderValue)
    86. Dim enc As Encoder = Encoder.SaveFlag
    87. Dim ep As EncoderParameters = New EncoderParameters(2)
    88. ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.MultiFrame))
    89. ep.Param(1) = New EncoderParameter(Encoder.Compression, CLng(compressEncoder))
    90. Dim pages As Image = images(0)
    91. Dim frame As Integer = 0
    92. Dim info As ImageCodecInfo = GetEncoderInfo("image/tiff")
    93. For Each img As Image In images
    94. If frame = 0 Then
    95. pages = img
    96. pages.Save(outFile, info, ep)
    97. Else
    98. ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.FrameDimensionPage))
    99. pages.SaveAdd(img, ep)
    100. End If
    101. If frame = images.Length - 1 Then
    102. ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.Flush))
    103. pages.SaveAdd(ep)
    104. End If
    105. frame += 1
    106. Next
    107. End Sub
    108. #End Region
    109. #Region "Poststempel"
    110. Private nStartPos As Point
    111. Private nDragPos As Point
    112. Private _L_Pb1 As Point
    113. Private _L_Pb2 As Point
    114. Private _Sp_X As Integer
    115. Private _SP_Y As Integer
    116. Private Sub PictureBox2_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox2.MouseDown
    117. If e.Button = Windows.Forms.MouseButtons.Left Then
    118. nStartPos = PictureBox2.Location
    119. nDragPos = PictureBox2.PointToScreen(New Point(e.X, e.Y))
    120. _L_Pb1 = PictureBox1.Location
    121. _L_Pb2 = PictureBox2.Location
    122. End If
    123. End Sub
    124. Private Sub PictureBox2_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox2.MouseMove
    125. If e.Button = Windows.Forms.MouseButtons.Left Then
    126. Dim nCurPos As Point = PictureBox2.PointToScreen(New Point(e.X, e.Y))
    127. PictureBox2.Location = New Point(nStartPos.X + nCurPos.X - nDragPos.X, nStartPos.Y + nCurPos.Y - nDragPos.Y)
    128. _L_Pb1 = PictureBox1.Location
    129. _L_Pb2 = PictureBox2.Location
    130. End If
    131. End Sub
    132. Private Sub PictureBox2_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox2.MouseUp
    133. _Sp_X = CInt((_L_Pb2.X - _L_Pb1.X) * 1.9701)
    134. _SP_Y = CInt((_L_Pb2.Y - _L_Pb1.Y) * 1.9701)
    135. End Sub
    136. Private Sub DrawImage(x As Graphics)
    137. Throw New NotImplementedException()
    138. End Sub
    139. #End Region
    140. #Region "Buttons"
    141. Private Sub btn_abbruch_Click(sender As Object, e As EventArgs) Handles btn_abbruch.Click
    142. Zwischenablage_Archiv.__PEverarbe = False
    143. Me.Close()
    144. End Sub
    145. Private Sub btn_Ubernahme_Click(sender As Object, e As EventArgs) Handles btn_Ubernahme.Click
    146. Zwischenablage_Archiv.__PEverarbe = True
    147. Dim _TextAusOCT_TIFF As String = Nothing
    148. If cb_TexterkennungDurchfuehren.Checked = True Then
    149. Using engine As TesseractEngine = New TesseractEngine(tessdataPath, My.Settings.system_start_posteingang_sprache, EngineMode.Default)
    150. Using pix As Pix = Pix.LoadFromFile(TextBox1.Text)
    151. Using page As Tesseract.Page = engine.Process(pix)
    152. _TextAusOCT_TIFF = page.GetText()
    153. End Using
    154. End Using
    155. End Using
    156. End If
    157. Dim _g As Graphics = Graphics.FromImage(_Image)
    158. _g.DrawString("Dieses Dokument wurde durch den Sachbearbeiter: " & My.Settings.clm_benutzername & " am " & Date.Now.ToShortDateString & " archiviert.", New Font("Arial", 8, FontStyle.Bold), Brushes.Black, 25, 15)
    159. If cb_DruckDokIdImBeleg.Checked = True Then
    160. _g.DrawString("DOKUMENTEN-ID. " & _DIDimage.ToString, New Font("Arial", 8, FontStyle.Bold), Brushes.Black, 590, 10)
    161. End If
    162. If cb_PoststempelAufdrucken.Checked = True Then
    163. Dim rec As Rectangle = New Rectangle(_Sp_X - 10, _SP_Y - 30, 140, 80)
    164. _g.DrawRectangle(Pens.Blue, rec)
    165. _g.DrawString("XXXXXX GmbH", New Font("Arial", 8, FontStyle.Regular), Brushes.Blue, _Sp_X + 30, _SP_Y - 21)
    166. _g.DrawString("POSTEINGANG", New Font("Arial", 12, FontStyle.Bold), Brushes.Blue, _Sp_X - 2, _SP_Y)
    167. _g.DrawString(Date.Now.ToShortDateString, New Font("Arial", 12, FontStyle.Bold), Brushes.Red, _Sp_X + 16, _SP_Y + 24)
    168. End If
    169. PictureBox1.Image = _Image
    170. Archiv_Dokumentenstam_BinardatenPDFTableAdapter.UpdateQuery_DokUpd_PE_nachDokID(imageToByteArray(_Image), _TextAusOCT_TIFF, My.Settings.clm_benutzername, Date.Now, _DIDimage)
    171. _g.Dispose()
    172. Me.Close()
    173. End Sub
    174. #End Region
    175. #Region "Sonstiges und Image convertieren für Datenbank"
    176. Function getrandombystring(ByVal input As String, ByVal charamount As Integer) As String
    177. Dim r As New Random
    178. Dim strb As New System.Text.StringBuilder
    179. Dim chararray() As Char = input.ToCharArray
    180. For i As Integer = 1 To charamount
    181. Dim ti As Integer = r.Next(0, chararray.Length)
    182. strb.Append(chararray(ti))
    183. Next
    184. Return strb.ToString
    185. End Function
    186. Public Function imageToByteArray(ByVal imageIn As System.Drawing.Image) As Byte()
    187. Dim ms As MemoryStream = New MemoryStream()
    188. imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff)
    189. Return ms.ToArray()
    190. End Function
    191. Public Function byteArrayToImage(ByVal byteArrayIn As Byte()) As Image
    192. Dim ms As MemoryStream = New MemoryStream(byteArrayIn)
    193. Dim returnImage As Image = Image.FromStream(ms)
    194. Return returnImage
    195. End Function
    196. #End Region
    197. End Class


    Wünsche einen schönen Abend :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „michl75“ ()

    Neu

    Hi. Da ich noch im Urlaub bin, kann ich nur Psydocode liefern, wie man Dein Problem angehen könnte. Der erste Teil ist klar. Die Seiten der PDF werden als Image gerendert in ein ImageArray abgelegt <- SaveAsImage(pdf). An jedes einzelne Image kommst Du über den Index vom Array. images(0) wäre hier also die erste Seite auf der Du einen Stempel anbringen möchtest. Bedeutet das Du von images(0) ein Graphics erstellen müsstest. Using g As Graphics = Graphics.FromImage(images(0)). Zeichne jetzt deinen Stempel drauf und End Using. Erst danach per JoinTiffImages die images zu einer MultiFrame-TIFF speichern. Am Ende sollten dann auch die Images im ImageArray Disposed werden wenn diese nicht mehr benötigt werden. Grundsatz ist ja immer, lasse ein Objekt nur so lange leben, wie es benötigt wird.

    Zu Deiner anderen Frage: Wenn Du wieder ein MultiFrame-TIFF von der Platte lädst, wird Dir immer nur das erste Bild angezeigt. Du müsstest hier erst das entsprechende Image Property (Image.GetFrameDimensionsCount) auslesen, wieviel Bilder in der MultiFrame-TIFF enthalten sind und über entsprechenden Code kannst Du dann wieder auf jedes einzelne Bild zugreifen bzw das ganze wieder in ein ImageArray schaufeln.
    Mfg -Franky-

    Neu

    Also erst mal danke für die Antwort aus dem Urlaub ... und schönen Urlaub gleich dazu :)
    Mein letzter Urlaub war 2016 .... :)

    Ok die Erklärung bringt mich zum Denken, werde das morgen direkt mal versuchen umzusetzen.

    Vielen Dank für die Erklärung !

    Schönen Abend

    Neu

    Ich sage auch erst einmal Danke.

    michl75 schrieb:

    Mein letzter Urlaub war 2016 ....

    Oha, dann wird es aber mal wieder Zeit. ;) Ansonsten ist Deine Problemstellung ja kein Hexenwerk das nicht gelöst werden könnte.
    Mfg -Franky-

    Neu

    Ja tatsächlich wäre es mal wieder an der Zeit und wenn es nur 2 Wochen durchgehend in der Hängematte im Garten ist :)

    So also ich hab heute immer wieder mal daran gebastelt.

    Das ganze Zwischenspeichern ist weg. Es wird nur noch die Originaldatei einmalig als Original PDF in mein Tempverzeichnis kopieret (was ja Abends gelöscht wird) ... das soll ja auch so bleiben.

    Weiterhin habe ich ein Blättern eingefügt um im Tiff vor und zurück zu blättern.

    Den Namen Join habe ich auch umbenannt : MultiFrameTiff

    -Franky- schrieb:

    Zeichne jetzt deinen Stempel drauf und End Using. Erst danach per JoinTiffImages die images zu einer MultiFrame-TIFF speichern


    Der Stempel soll nicht gleich am Anfang rein, da dieser verschoben werden kann... so das er möglichst wenig bedeckt: Siehe Anlage x1

    Wird dann Übernehmen gedrückt, soll der Stempel auf die Seite drauf , so wie die anderen sagen die in der (x1) Form stehen. (Drucken kommt später) ... wenn gedrückt, siehe Anlage x2
    Hat also schon mal funktioniert, es werden zwei Seiten übernommen.....

    Wenn das dann in der DB MSSQL (varbinary(MAX)) gespeichert und ich rufe diesen Datensatz auf ... kommt Anzahl Seiten 0 und ich kann auch nicht blättern (Anlage x3)

    Das ist der Code vom Dokument aufnehmen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.ComponentModel
    3. Imports System.IO
    4. Imports System.Drawing
    5. Imports System.Drawing.Imaging
    6. Imports Tesseract
    7. Imports Spire.Pdf
    8. Public Class FileConvert_Posteingang_01
    9. Friend _DIDimage As Integer
    10. Friend _DokQuelle As String
    11. Private _nV As Single = 0
    12. Private _nH As Single = 0
    13. Private _nW As Single = 0
    14. Private tessdataPath As String = Windows.Forms.Application.StartupPath.Replace("\bin\Debug", "") + Path.DirectorySeparatorChar & "\Archiv\tessdata"
    15. Private _TextAusOCT_TIFF As String = Nothing
    16. Private _Bmp_Subweit As Bitmap
    17. 'Private _BmpActikDisplay As Bitmap
    18. Private _totalPages As Integer
    19. Private _currentPage As Integer = 0
    20. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    21. tslbl_benutzername_system.Text = Environment.UserName.ToString
    22. If My.Settings.clm_benutzer_isadmin = True Then
    23. txb_faktor_X.Enabled = True
    24. txb_faktor_Y.Enabled = True
    25. End If
    26. DatenLaden()
    27. End Sub
    28. #Region "DatenLaden und Verarbeitung bzw. Hauptconvertierung"
    29. Private Sub DatenLaden()
    30. Dim _FileInfo As FileInfo
    31. _FileInfo = New FileInfo(_DokQuelle)
    32. Dim _Speichercode1 As String = Nothing
    33. NeuerVorgangCode1:
    34. _Speichercode1 = getrandombystring("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 12)
    35. If CDec(Archiv_Dokumentenstam_BinardatenPDFTableAdapter.ScalarQuery_SPEICHERCODEPRUEFUNG_nachSpeichercode(_Speichercode1)) > 0 Then
    36. GoTo NeuerVorgangCode1
    37. End If
    38. Dim _ClmTempDaten_Pfad As String = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\CLM_TempFile\"
    39. Dim _ClmTempDaten_Dateiname As String = "MSCLM_DC_" & _DIDimage.ToString("0000000") & "_" & _Speichercode1 & ".Tiff"
    40. TextBox1.Text = _ClmTempDaten_Pfad & _ClmTempDaten_Dateiname
    41. If _FileInfo.Extension = ".pdf" Or _FileInfo.Extension = ".PDF" Then
    42. ' Jetzt wird die kopierte Originaldatei von PDF in Multi-Tiff gewandelt
    43. Dim pdf As PdfDocument = New PdfDocument()
    44. pdf.LoadFromFile(_DokQuelle)
    45. Dim images As Image() = PDFzuImage(pdf)
    46. MultiFrameTiff(images, TextBox1.Text, EncoderValue.CompressionLZW)
    47. Dim _fs As FileStream = File.Open(TextBox1.Text, FileMode.Open, FileAccess.Read)
    48. _Bmp_Subweit = CType(Bitmap.FromStream(_fs), Bitmap)
    49. _totalPages = CInt(_Bmp_Subweit.GetFrameCount(FrameDimension.Page) - 1)
    50. _Bmp_Subweit.SelectActiveFrame(FrameDimension.Page, _currentPage)
    51. ' Soll natürlich sofort angezeigt werden
    52. PictureBox1.Image = _Bmp_Subweit
    53. ElseIf _FileInfo.Extension = ".tiff" Or _FileInfo.Extension = ".Tiff" Or _FileInfo.Extension = ".tif" Or _FileInfo.Extension = ".Tif" Then
    54. ElseIf _FileInfo.Extension = ".xps" Or _FileInfo.Extension = ".XPS" Then
    55. Else
    56. MessageBox.Show("Die übergebene Datei hat ein Format, dass nicht gelesen werden kann. Bitte in ein Lesbares Format umwandeln, empfohlen wird: TIF oder PDF. In der Datenbank werden die Daten als TIF abgelegt.", "STOP der Verarbeitung", MessageBoxButtons.OK, MessageBoxIcon.Stop)
    57. Exit Sub
    58. End If
    59. txb_faktor_X.Text = My.Settings.archiv_faktor_stempelberechnungX.ToString("N4")
    60. txb_faktor_Y.Text = My.Settings.archiv_faktor_stempelberechnungY.ToString("N4")
    61. lbl_Bildaufloesung.Text = "Höhe: " & PictureBox1.Image.PhysicalDimension.Height.ToString & " Breite: " & PictureBox1.Image.PhysicalDimension.Width.ToString
    62. lbl_fenstergroesse.Text = "Höhe: " & PictureBox1.Height.ToString & " Breite: " & PictureBox1.Width.ToString
    63. Dim _Verhaeltnis_H As Double = CDbl(PictureBox1.Image.PhysicalDimension.Height / PictureBox1.Height)
    64. Dim _Verhaeltnis_W As Double = CDbl(PictureBox1.Image.PhysicalDimension.Width / PictureBox1.Width)
    65. _nV = CInt((_Verhaeltnis_H + _Verhaeltnis_W) / 2)
    66. lbl_BilderVerhaeltnis.Text = _Verhaeltnis_H.ToString("N4") & " / " & _Verhaeltnis_W.ToString("N4")
    67. _nH = 297 / PictureBox1.Image.PhysicalDimension.Height
    68. _nW = 210 / PictureBox1.Image.PhysicalDimension.Width
    69. lbl_MmPixel.Text = "Höhe: " & _nH.ToString("N4") & " Breite: " & _nW.ToString("N4")
    70. End Sub
    71. Private Function PDFzuImage(ByVal document As PdfDocument) As Image() ' DAS FUNKTIONIERT NUN GUT !!!
    72. Dim images As Image() = New Image(document.Pages.Count - 1) {}
    73. For i As Integer = 0 To document.Pages.Count - 1
    74. images(i) = document.SaveAsImage(i)
    75. Next
    76. lbl_DokSeitenGesamt.Text = document.Pages.Count.ToString
    77. For Each img As Image In images
    78. Using engine As TesseractEngine = New TesseractEngine(tessdataPath, My.Settings.system_start_posteingang_sprache, EngineMode.Default)
    79. Using pix As Pix = PixConverter.ToPix(DirectCast(img, Bitmap)) ' Pix.LoadFromFile(TextBox1.Text)
    80. Using page As Tesseract.Page = engine.Process(pix)
    81. _TextAusOCT_TIFF = _TextAusOCT_TIFF + page.GetText()
    82. End Using
    83. End Using
    84. End Using
    85. Next
    86. Return images
    87. End Function
    88. Private Sub MultiFrameTiff(ByVal images As Image(), ByVal outFile As String, ByVal compressEncoder As EncoderValue)
    89. Dim enc As Encoder = Encoder.SaveFlag
    90. Dim ep As EncoderParameters = New EncoderParameters(2)
    91. ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.MultiFrame))
    92. ep.Param(1) = New EncoderParameter(Encoder.Compression, CLng(compressEncoder))
    93. Dim pages As Image = images(0)
    94. Dim frame As Integer = 0
    95. Dim info As ImageCodecInfo = GetEncoderInfo("image/tiff")
    96. For Each img As Image In images
    97. If frame = 0 Then
    98. pages = img
    99. pages.Save(outFile, info, ep)
    100. Else
    101. ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.FrameDimensionPage))
    102. pages.SaveAdd(img, ep)
    103. End If
    104. If frame = images.Length - 1 Then
    105. ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.Flush))
    106. pages.SaveAdd(ep)
    107. End If
    108. frame += 1
    109. Next
    110. End Sub
    111. Private Shared Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo
    112. Dim encoders() As ImageCodecInfo = ImageCodecInfo.GetImageEncoders()
    113. If encoders IsNot Nothing Then
    114. For i As Integer = 0 To encoders.Length - 1
    115. If encoders(i).MimeType = mimeType Then
    116. Return encoders(i)
    117. End If
    118. Next
    119. End If
    120. Return Nothing
    121. End Function
    122. #End Region
    123. #Region "Poststempel"
    124. Private nStartPos As Point
    125. Private nDragPos As Point
    126. Private _L_Pb1 As Point
    127. Private _L_Pb2 As Point
    128. Private _Sp_X As Integer
    129. Private _SP_Y As Integer
    130. Private Sub PictureBox2_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox2.MouseDown
    131. If e.Button = Windows.Forms.MouseButtons.Left Then
    132. nStartPos = PictureBox2.Location
    133. nDragPos = PictureBox2.PointToScreen(New Point(e.X, e.Y))
    134. _L_Pb1 = PictureBox1.Location
    135. _L_Pb2 = PictureBox2.Location
    136. End If
    137. End Sub
    138. Private Sub PictureBox2_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox2.MouseMove
    139. If e.Button = Windows.Forms.MouseButtons.Left Then
    140. Dim nCurPos As Point = PictureBox2.PointToScreen(New Point(e.X, e.Y))
    141. PictureBox2.Location = New Point(nStartPos.X + nCurPos.X - nDragPos.X, nStartPos.Y + nCurPos.Y - nDragPos.Y)
    142. _L_Pb1 = PictureBox1.Location
    143. _L_Pb2 = PictureBox2.Location
    144. End If
    145. End Sub
    146. Private Sub PictureBox2_MouseUp(sender As Object, e As MouseEventArgs) Handles PictureBox2.MouseUp
    147. _Sp_X = CInt((_L_Pb2.X - _L_Pb1.X) * 1.9701)
    148. _SP_Y = CInt((_L_Pb2.Y - _L_Pb1.Y) * 1.9701)
    149. End Sub
    150. Private Sub DrawImage(x As Graphics)
    151. Throw New NotImplementedException()
    152. End Sub
    153. #End Region
    154. #Region "Sonstiges und Image convertieren für Datenbank"
    155. Function getrandombystring(ByVal input As String, ByVal charamount As Integer) As String
    156. Dim r As New Random
    157. Dim strb As New System.Text.StringBuilder
    158. Dim chararray() As Char = input.ToCharArray
    159. For i As Integer = 1 To charamount
    160. Dim ti As Integer = r.Next(0, chararray.Length)
    161. strb.Append(chararray(ti))
    162. Next
    163. Return strb.ToString
    164. End Function
    165. Public Function imageToByteArray(ByVal imageIn As System.Drawing.Image) As Byte()
    166. Dim ms As MemoryStream = New MemoryStream()
    167. imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff)
    168. Return ms.ToArray()
    169. End Function
    170. Public Function byteArrayToImage(ByVal byteArrayIn As Byte()) As Image
    171. Dim ms As MemoryStream = New MemoryStream(byteArrayIn)
    172. Dim returnImage As Image = Image.FromStream(ms)
    173. Return returnImage
    174. End Function
    175. #End Region
    176. #Region "Buttons"
    177. Private Sub btn_abbruch_Click(sender As Object, e As EventArgs) Handles btn_abbruch.Click
    178. Zwischenablage_Archiv.__PEverarbe = False
    179. Me.Close()
    180. End Sub
    181. Private Sub btn_Ubernahme_Click(sender As Object, e As EventArgs) Handles btn_Ubernahme.Click
    182. Zwischenablage_Archiv.__PEverarbe = True
    183. If cb_TexterkennungDurchfuehren.Checked = False Then
    184. _TextAusOCT_TIFF = Nothing
    185. End If
    186. Dim _g As Graphics = Graphics.FromImage(_Bmp_Subweit)
    187. _g.DrawString("Dieses Dokument wurde durch den Sachbearbeiter: " & My.Settings.clm_benutzername & " am " & Date.Now.ToShortDateString & " archiviert.", New Font("Arial", 8, FontStyle.Bold), Brushes.Black, 25, 15)
    188. If cb_DruckDokIdImBeleg.Checked = True Then
    189. _g.DrawString("DOKUMENTEN-ID. " & _DIDimage.ToString, New Font("Arial", 8, FontStyle.Bold), Brushes.Black, 590, 10)
    190. End If
    191. If cb_PoststempelAufdrucken.Checked = True Then
    192. Dim rec As Rectangle = New Rectangle(_Sp_X - 10, _SP_Y - 30, 140, 80)
    193. _g.DrawRectangle(Pens.Blue, rec)
    194. _g.DrawString("XXXXX", New Font("Arial", 8, FontStyle.Regular), Brushes.Blue, _Sp_X + 30, _SP_Y - 21)
    195. _g.DrawString("POSTEINGANG", New Font("Arial", 12, FontStyle.Bold), Brushes.Blue, _Sp_X - 2, _SP_Y)
    196. _g.DrawString(Date.Now.ToShortDateString, New Font("Arial", 12, FontStyle.Bold), Brushes.Red, _Sp_X + 16, _SP_Y + 24)
    197. End If
    198. PictureBox1.Image = _Bmp_Subweit
    199. Dim count As Integer = _Bmp_Subweit.GetFrameCount(FrameDimension.Page)
    200. MsgBox("Es werden zwei Seiten gespeichert: " & count.ToString)
    201. Archiv_Dokumentenstam_BinardatenPDFTableAdapter.UpdateQuery_DokUpd_PE_nachDokID(imageToByteArray(_Bmp_Subweit), _TextAusOCT_TIFF, My.Settings.clm_benutzername, Date.Now, _DIDimage)
    202. _g.Dispose()
    203. Me.Close()
    204. End Sub
    205. Private Sub Btn_SeiteZurueck_Click(sender As Object, e As EventArgs) Handles Btn_SeiteZurueck.Click
    206. If _currentPage > 0 Then
    207. _currentPage -= 1
    208. _Bmp_Subweit.SelectActiveFrame(FrameDimension.Page, _currentPage)
    209. PictureBox1.Refresh()
    210. End If
    211. End Sub
    212. Private Sub Btn_SeiteWeiter_Click(sender As Object, e As EventArgs) Handles Btn_SeiteWeiter.Click
    213. If _currentPage < _totalPages Then
    214. _currentPage += 1
    215. _Bmp_Subweit.SelectActiveFrame(FrameDimension.Page, _currentPage)
    216. PictureBox1.Refresh()
    217. End If
    218. End Sub
    219. #End Region
    220. End Class


    Und so wird in anderer Form das Tiff angezeigt, mit Funktion vor und zurück...
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub dgv_Dokumente_MouseClick(sender As Object, e As MouseEventArgs) Handles dgv_Dokumente.MouseClick
    2. If dgv_Dokumente.SelectedRows.Count <> 0 Then
    3. Try
    4. Dim _temppath As String = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\CLM_TempFile\"
    5. Dim _tempfile As String = "BU_" & getrandombystring("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", 7) & ".pdf"
    6. _fullfilename = _temppath & _tempfile
    7. Dim _FE As String = Archiv_Dokumentenstam_PDFTableAdapter.ScalarQuery_nachID_FileExtension(CInt(dgv_Dokumente.CurrentRow.Cells(0).Value)).ToString
    8. If Directory.Exists(_temppath) Then
    9. If _FE = ".PDF" Then
    10. Dim _file() As Byte = Archiv_Dokumentenstam_PDFTableAdapter.ScalarQuery_nachID_PDFBinardaten(CInt(dgv_Dokumente.CurrentRow.Cells(0).Value))
    11. TabControl_DateiAnzeiger.SelectedTab = TbPDF
    12. If _file Is Nothing Then
    13. WebBrowser1.Text = "Es ist kein PDF vorhanden, bitte prüfen und ggf. Administrator ansprechen!"
    14. 'MessageBox.Show("Es ist kein PDF vorhanden, bitte prüfen und ggf. Administrator ansprechen!", "INFO", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    15. Exit Sub
    16. Else
    17. Dim K As Long = UBound(_file)
    18. Dim fs As New FileStream(_fullfilename, FileMode.OpenOrCreate, FileAccess.Write)
    19. fs.Write(_file, 0, (K + 1))
    20. fs.Close()
    21. 'Me.PdfViewer1.LoadFromFile(_fullfilename)
    22. WebBrowser1.Navigate(_fullfilename)
    23. ' Bilddaten decodieren
    24. ' txb_BelegText1
    25. End If
    26. Else
    27. [b]TabControl_DateiAnzeiger.SelectedTab = TbTiff
    28. _Bmp_Subweit = byteArrayToImage(Archiv_Dokumentenstam_PDFTableAdapter.ScalarQuery_nachID_PDFBinardaten(CInt(dgv_Dokumente.CurrentRow.Cells(0).Value)))
    29. _totalPages = CInt(_Bmp_Subweit.GetFrameCount(FrameDimension.Page) - 1)
    30. TsLbl_TiffAnzahlSeiten.Text = _totalPages.ToString
    31. _Bmp_Subweit.SelectActiveFrame(FrameDimension.Page, _currentPage)
    32. PictureBox_Binaerdaten_Tiff.Image = _Bmp_Subweit[/b]
    33. End If
    34. End If
    35. Catch ex As System.Exception
    36. MessageBox.Show(ex.Message & vbCrLf & ex.StackTrace, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    37. Exit Sub
    38. End Try
    39. End If
    40. End Sub
    41. Private Sub Btn_SeiteZurueck_Click(sender As Object, e As EventArgs) Handles Btn_SeiteZurueck.Click
    42. If _currentPage > 0 Then
    43. _currentPage -= 1
    44. _Bmp_Subweit.SelectActiveFrame(FrameDimension.Page, _currentPage)
    45. PictureBox_Binaerdaten_Tiff.Refresh()
    46. End If
    47. End Sub
    48. Private Sub Btn_SeiteWeiter_Click(sender As Object, e As EventArgs) Handles Btn_SeiteWeiter.Click
    49. If _currentPage < _totalPages Then
    50. _currentPage += 1
    51. _Bmp_Subweit.SelectActiveFrame(FrameDimension.Page, _currentPage)
    52. PictureBox_Binaerdaten_Tiff.Refresh()
    53. End If
    54. End Sub
    55. Public Function imageToByteArray(ByVal imageIn As System.Drawing.Image) As Byte()
    56. Dim ms As MemoryStream = New MemoryStream()
    57. imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif)
    58. Return ms.ToArray()
    59. End Function
    60. Public Function byteArrayToImage(ByVal byteArrayIn As Byte()) As Image
    61. Dim ms As MemoryStream = New MemoryStream(byteArrayIn)
    62. Dim returnImage As Image = Image.FromStream(ms)
    63. Return returnImage
    64. End Function
    65. [/code]



    EDIT:
    Was ich noch hinzufügen möchte... in der Anzeige gibts den Passus

    VB.NET-Quellcode

    1. ​If _FE = ".PDF" Then
    , weil in der DB noch PDFs auch gespeichert sind, die ich aber wenn alles funktioniert auch auf Tiff umschreibe und dann wird das mit ="PDF" und WebBroser1 etc. verschwinden.

    Bilder
    • x1.JPG

      83,07 kB, 1.061×694, 6 mal angesehen
    • x2.JPG

      9,96 kB, 245×145, 41 mal angesehen
    • x3.JPG

      15,4 kB, 556×357, 7 mal angesehen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „michl75“ ()

    Neu

    Hi. So wie ich Dich verstehe läuft soweit alles bis auf die Tatsache das wenn Du die MultiFrame-TIFF wieder aus der DB holst kein Count und somit keine einzelnen Bilder daraus aufgerufen werden können. Deinen Code kann ich mir erst in zwei Wochen so richtig am PC anschauen. Auf dem Handy ist das nicht so wirklich übersichtlich. Bei Datenbanken bin ich allerdings etwas raus. Deswegen kann ich Dir auch nicht sagen ob varbinary(MAX) hier der richtige Type ist. Ich war bisher der Meinung das man für Dateien in einer DB den Type BLOB verwendet. Eventuell kann @ErfinderDesRades da etwas mehr Licht ins Dunkle bringen.
    Mfg -Franky-

    Neu

    -Franky- schrieb:

    Hi. So wie ich Dich verstehe läuft soweit alles bis auf die Tatsache das wenn Du die MultiFrame-TIFF wieder aus der DB holst kein Count und somit keine einzelnen Bilder daraus aufgerufen werden können.


    Habe mich damit nochmal auseinander gesetzt... also das gespeicherte Bild ist kein Multipage.
    So lasse ich es wieder anzeigen und hab da ein "Save" eingesetzt, so dass zum testen eine Datei erstellt wird. Macht man die über Windows normal als Anzeige auf, kein Multipage ... keine 2...3.. Seite...

    VB.NET-Quellcode

    1. _Bmp_Subweit = byteArrayToImage(Archiv_Dokumentenstam_PDFTableAdapter.ScalarQuery_nachID_PDFBinardaten(CInt(dgv_Dokumente.CurrentRow.Cells(0).Value)))
    2. _totalPages = CInt(_Bmp_Subweit.GetFrameCount(FrameDimension.Page) - 1)
    3. [b]TsLbl_TiffAnzahlSeiten.Text = _totalPages.ToString[/b]
    4. _Bmp_Subweit.SelectActiveFrame(FrameDimension.Page, _currentPage)
    5. PictureBox_Binaerdaten_Tiff.Image = _Bmp_Subweit
    6. [b]_Bmp_Subweit.Save("C:\Users\Testuser\Documents\CLM_TempFile\Test_Mist01.tiff")[/b]

    Wie eben geschrieben diese Datei hat nur eine Seite.

    Also denke ich, dass mein Fehler im Speichern liegt.

    VB.NET-Quellcode

    1. Archiv_Dokumentenstam_BinardatenPDFTableAdapter.UpdateQuery_DokUpd_PE_nachDokID(BmpToBytes_MemStream(_Bmp_Subweit), _TextAusOCT_TIFF, My.Settings.clm_benutzername, Date.Now, _DIDimage)
    2. _g.Dispose()
    3. Me.Close()
    4. End Sub
    5. Private Function BmpToBytes_MemStream(ByVal bmp As Bitmap) As Byte()
    6. Dim ms As MemoryStream = New MemoryStream()
    7. bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Tiff)
    8. Dim bmpBytes As Byte() = ms.GetBuffer()
    9. bmp.Dispose()
    10. ms.Close()
    11. Return bmpBytes
    12. End Function


    Wie du schon sagtest @-Franky- ... wahrscheinlich weil ja diese Seite aktiviert ist/war...

    VB.NET-Quellcode

    1. _Bmp_Subweit.SelectActiveFrame(FrameDimension.Page, _currentPage)


    Jetzt habe ich mir das Bitmap.Save mal angesehen, aber z. B. ein "Save ALL" gibts nicht.
    Also gehe ich mal davon aus, dass ich mit einer Schleife das ganze zu "irgenwas" machen muss und erst dann ab in die DB.

    Liege ich da richtig?

    Lg M

    Neu

    RodFromGermany schrieb:

    @michl75 Setze einen Haltepunkt auf die Zeile und sieh Dir den Inhalt der Variablen an.
    Irgend etwas ist da wohl Nothing.


    Hallo @RodFromGermany
    deinen Beitrag habe ich ganz übersehen... tut mir leid! War keine Absicht...

    Tatsächlich war Nothing in der Fehlerausgabe vorhanden, dies ist aber mittlerweile "behoben" ...
    Soweit läuft alles durch, speichert usw. und kann wieder auslesen.
    Jedoch leider nur immer mit einer Seite, statt mehrerren... so wie im Beitrag eins vorher geschrieben.

    Neu

    Hi. Da ich heute mal wieder vor einem PC sitze, zeige ich Dir wie ich mir das vorstellen könnte. Ich habe das relativ einfach gehalten. Aber zuerst etwas Code (zwei Button, eine PictureBox und eine TrackBar auf der Form). In der Zip ist eine MultiFrame-TIFF zum testen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.ComponentModel
    3. Imports System.Drawing.Imaging
    4. Public Class Form1
    5. Private Enum TiffCompression As Long
    6. None = EncoderValue.CompressionNone
    7. RLE = EncoderValue.CompressionRle
    8. LZW = EncoderValue.CompressionLZW
    9. End Enum
    10. Private Images As List(Of Image)
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. DisposeImages()
    13. Images = LoadTiff("D:\test1.tif")
    14. If Images IsNot Nothing Then
    15. TrackBar1.Maximum = Images.Count - 1
    16. PictureBox1.Image = Images(TrackBar1.Value)
    17. End If
    18. End Sub
    19. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    20. SaveAsTiff("d:\test2.tif", Images)
    21. End Sub
    22. Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
    23. DisposeImages()
    24. End Sub
    25. Private Sub TrackBar1_ValueChanged(sender As Object, e As EventArgs) Handles TrackBar1.ValueChanged
    26. If Images IsNot Nothing Then
    27. PictureBox1.Image = Images(TrackBar1.Value)
    28. End If
    29. End Sub
    30. Private Sub DisposeImages()
    31. If Images IsNot Nothing Then
    32. Do Until Images.Count = 0
    33. Images(0).Dispose()
    34. Images.RemoveAt(0)
    35. Loop
    36. Images = Nothing
    37. End If
    38. End Sub
    39. Private Function SaveAsTiff(FileName As String,
    40. Images As List(Of Image),
    41. Optional Compression As TiffCompression = TiffCompression.LZW) As Boolean
    42. Using FileStream As FileStream = File.Create(FileName)
    43. Dim Encoder As ImageCodecInfo = ImageCodecInfo.GetImageEncoders().First(Function(x) x.MimeType = "image/tiff")
    44. Using EncoderParams As New EncoderParameters(2)
    45. EncoderParams.Param(1) = New EncoderParameter(Imaging.Encoder.Compression, Compression)
    46. For Item As Integer = 0 To Images.Count - 1
    47. If Item = 0 Then
    48. EncoderParams.Param(0) = New EncoderParameter(Imaging.Encoder.SaveFlag, EncoderValue.MultiFrame)
    49. Images(0).Save(FileStream, Encoder, EncoderParams)
    50. EncoderParams.Param(0).Dispose()
    51. Else
    52. EncoderParams.Param(0) = New EncoderParameter(Imaging.Encoder.SaveFlag, EncoderValue.FrameDimensionPage)
    53. Images(0).SaveAdd(Images(Item), EncoderParams)
    54. EncoderParams.Param(0).Dispose()
    55. End If
    56. Next
    57. EncoderParams.Param(0) = New EncoderParameter(Imaging.Encoder.SaveFlag, EncoderValue.Flush)
    58. Images(0).SaveAdd(EncoderParams)
    59. For Each Param In EncoderParams.Param
    60. Param.Dispose()
    61. Next
    62. End Using
    63. End Using
    64. Return File.Exists(FileName)
    65. End Function
    66. Private Function LoadTiff(FileName As String) As List(Of Image)
    67. Dim Ret As New List(Of Image)
    68. Using Img As Image = Image.FromFile(FileName)
    69. Dim Pages As Integer = Img.GetFrameCount(FrameDimension.Page)
    70. For Page As Integer = 0 To Pages - 1
    71. Img.SelectActiveFrame(FrameDimension.Page, Page)
    72. Using MemStream As New MemoryStream
    73. Img.Save(MemStream, ImageFormat.Png)
    74. Ret.Add(Image.FromStream(MemStream))
    75. End Using
    76. Next
    77. End Using
    78. Return Ret
    79. End Function
    80. End Class


    Button1 lädt die test1.tif. Über die TrackBar kannst Du zwischen den Bildern wechseln. Button2 speichert dann wieder alles zu einer MultiFrame-TIFF. Irgendwo dazwischen kommt der Stempel drauf. Ich habe hier anstelle eines ImageArrays eine List(Of Image) verwendet. Es ist auch kein Problem ein Array in eine List zu konvertieren und umgekehrt. Wann Du nun den Stempel aufbringst ist egal. Wichtig ist ja nur das alle Bilder der TIFF wieder in eine List (oder ImageArray) decodiert werden müssen um diese später wieder zu einer TIFF zu codieren. Anstelle die List (oder das ImageArray) in eine Datei zu schreiben, kannst Du natürlich auch das ganze in einen MemoryStream schreiben, von dem man dann, wenn benötigt, ein ByteArray erstellen kann. Jenachdem was Du benötigst um die TIFF dann in die DB zu schreiben. Beim lesen aus der DB, kommt es drauf an wie Du die Daten erhältst. zB. DB -> ByteArray -> MemoryStream -> Image (TIFF) -> List(Of Image) (oder ImageArray) / Seite bearbeiten wo der Stempel drauf soll / List(Of Image) (oder ImageArray) -> MemoryStream -> ByteArray -> DB Letzteres ist nur eine grobe Darstellung wie es laufen könnte.
    Dateien
    • test1.zip

      (221,95 kB, 1 mal heruntergeladen, zuletzt: )
    Mfg -Franky-

    Neu

    Wow ... einfach mal auf die schnelle so einen Code hingehauen... :)

    Wir hatten aber immerhin heute schon die gleiche Idee .. List(Of Image)... ich wollte die nur direkt in die DB Schreiben, hat nicht geklappt darum anderer Thread.

    Aber ich werde deins nachher testen, muss jetzt erst mal kochen ... Kinder haben hunger :)


    EDIT : Und vielen herzlichen Dank für die Unterstützung !! Wirklich vielen Dank!

    Neu

    @-Franky-

    Ich habe es erfolgreich implementieren können !! Läuft einfach perfekt und ich habe es direkt noch erweitert Basierend auf dem anderen Thread.... Die Tiff's werden in ein Verzeichnis mit kryptischen gespeichert usw.

    Aber das TIFF mit Blättern und Stempel und eindrucke auf die Seiten, einfach perfekt...


    Ich möchte mich nochmal für deine Hilfe herzlich bedanken !!! Vielen Dank!

    Einfach klasse und ich bin froh... darauf wird nun alles basieren und wir haben bald was vernünftiges :)

    Wünsch einen schönen Urlaub weiterhin ......

    Vg M