Преобразование TIFF в PDF приводит к недостатку данных для изображения

У меня есть утилита, которая конвертирует партии изображений 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. Может ли кто-нибудь подтвердить это или предложить обходной путь?


person DCNYAM    schedule 25.01.2012    source источник
comment
Какая версия PDFsharp, какая сборка? Если вы в настоящее время используете сборку WPF, попробуйте сборку GDI + (или наоборот), чтобы проверить, возникает ли проблема в обеих сборках. Какая версия Windows?   -  person I liked the old Stack Overflow    schedule 25.01.2012
comment
@PDFsharpTeam Я использую сборку PDFsharp версии 1.31 GDI + в Windows 7.   -  person DCNYAM    schedule 25.01.2012
comment
@PDFsharpTeam Я также пробовал это со сборкой WPF, и у меня была та же проблема.   -  person DCNYAM    schedule 25.01.2012
comment
Должен ли процесс с использованием PDFSharp декодировать и перекодировать изображения? Похоже, это могло быть из-за этой функции рисования. Я написал утилиту командной строки, чтобы сделать то же самое, но очень эффективное (без декодирования / перекодирования, просто переупаковывайте данные изображения). Пожалуйста, свяжитесь со мной, если вы хотите попробовать; вы можете быть бесплатным тестером кода.   -  person BitBank    schedule 26.01.2012
comment
Лучший обходной путь для ошибок Windows 7: используйте Windows XP. Серьезно: PDFsharp использует операционную систему для чтения файлов изображений (таким образом, используя различные форматы, поддерживаемые Windows), но с Windows 7 они внесли ошибки (некоторые файлы JPEG обрабатываются неправильно, теперь, похоже, проблема с файлами TIFF, слишком).   -  person I liked the old Stack Overflow    schedule 30.01.2012


Ответы (1)


Как указано в моем обновлении, после рассмотрения этой проблемы с подключением (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.

Это подтверждается комментарием PDFsharpTeam.

Кроме того, когда изображения читаются в Windows XP, для свойства flags объекта изображения устанавливается значение 77888. В Win7 оно имеет значение 77840. После просмотра документации MSDN для свойства flags (http://msdn.microsoft.com/en-us/library/system.drawing.image.flags.aspx), разница в том, что WinXP пометил изображение как изображение в градациях серого (как и у меня), но Win7 пометил его как изображение RGB. Похоже, это симптом проблемы, но я недостаточно знаю о форматах изображений и цветовых пространствах, чтобы авторитетно говорить об этом.

ОБНОВЛЕНИЕ (13.06.2014):

Продолжив сталкиваться с этой проблемой, я немного поработал и нашел на форумах PDFSharp сообщение, в котором упоминается эта проблема и делается ссылка на другое сообщение с исправлением.

http://forum.pdfsharp.net/viewtopic.php?f=2&t=2729

http://forum.pdfsharp.net/viewtopic.php?p=5967#p5967

По сути, в файле PdfImage.FaxEncode.cs есть два метода, которые необходимо обновить.

В обоих методах CountOneBits() и CountZeroBits() замените следующий код:

return found + hits;

с участием

found += hits;
if (found >= bitsLeft)
  return bitsLeft;
return found;
person DCNYAM    schedule 01.02.2012
comment
есть ли решение / обходной путь для этой ошибки? У нас есть та же проблема с приложением, с которым теперь сталкивается пользователь с обновленными ноутбуками под управлением Windows 7. - person ke3pup; 30.04.2012
comment
@techventure: я так и не нашел для этого хорошего решения. Запуск в Windows XP кажется лучшим решением. Для одного из наших клиентов с Windows 7 мы запустили приложение на виртуальной машине Windows XP, и, похоже, это нормально. Для класса System.Drawing.Image существует свойство PropertyItems. Содержимое этого свойства также отличалось между изображениями, которые работали, и изображениями, которые не работали, на случай, если вы захотите изучить это дополнительно. - person DCNYAM; 30.04.2012
comment
Я обнаружил, что клонирование изображения (по одному на каждую страницу, если есть несколько страниц) решило проблему. - person Foole; 22.11.2013