У меня есть утилита, которая конвертирует партии изображений TIFF в PDF-файлы с помощью библиотеки PDFSharp. Следующий код выполняет фактическое преобразование. Когда я открываю полученные PDF-файлы в Acrobat Reader, я получаю сообщение об ошибке для некоторых из них, в котором говорится: «Недостаточно данных для изображения». Остальные в порядке.
Что может быть причиной этого? Есть ли в коде что-то, что могло бы предотвратить это?
Public Shared Function ConvertImageToPDF(ByVal img As Image) As Byte()
Using ms As New MemoryStream()
Using pdf As New PdfDocument()
Dim pageCount = GetPageCount(img)
For index = 0 To (pageCount - 1)
Dim page = New PdfPage()
Using sourceImage = GetPage(img, index)
Using pageImage = XImage.FromGdiPlusImage(sourceImage)
page.Width = pageImage.PointWidth
page.Height = pageImage.PointHeight
pdf.Pages.Add(page)
Using xgr = XGraphics.FromPdfPage(pdf.Pages(index))
xgr.DrawImage(pageImage, 0, 0)
End Using
End Using
End Using
Next
pdf.Save(ms, False)
pdf.Close()
End Using
Return ms.ToArray()
End Using
End Function
Public Shared Function GetPageCount(ByVal img As Image) As Integer
If (img Is Nothing) Then
Return -1
End If
Return img.GetFrameCount(FrameDimension.Page)
End Function
Public Shared Function GetPage(ByVal img As Image, ByVal pageNumber As Integer) As Image
img.SelectActiveFrame(FrameDimension.Page, pageNumber)
Dim ms = New MemoryStream()
img.Save(ms, ImageFormat.Tiff)
Return Image.FromStream(ms)
End Function
ОБНОВИТЬ:
Если я запустил один и тот же код для тех же файлов TIFF, то файлы PDF, которые были повреждены раньше, теперь в порядке, а те, которые были в порядке раньше, теперь повреждены.
ОБНОВЛЕНИЕ 2:
После рассмотрения этой проблемы подключения (https://connect.microsoft.com/VisualStudio/feedback/details/584681/system-drawing-image-flags-has-different-value-in-vista-and-windows-7) и комментарий сообщества на этой странице MSDN (http://msdn.microsoft.com/en-us/library/system.drawing.image.save.aspx), похоже, проблема связана с ошибкой на уровне операционной системы в Windows 7. Может ли кто-нибудь подтвердить это или предложить обходной путь?