Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: DCNYAMОтветов: 1

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

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

pdfpdf-generationtiffpdfsharp

Ответы

Ответ 1 · DCNYAM

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы