将TIFF转换为PDF会导致图像数据不足

时间:2012-01-25 15:12:59

标签: pdf pdf-generation tiff pdfsharp

我有一个实用程序,可以使用PDFSharp库将批量的TIFF图像转换为PDF。以下代码执行实际转换。当我在Acrobat Reader中打开生成的PDF文件时,我收到某些错误消息,指出“图像数据不足”。其他人都很好。

可能导致这种情况的原因是什么?代码中是否有任何可以防止这种情况的内容?

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文件现在可以正常,而之前正常的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中的操作系统级错误有关。任何人都可以确认这还是提供解决方法?

1 个答案:

答案 0 :(得分:0)

如我的更新中所述,在查看此连接问题(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文档后{{3} }),区别在于WinXP将图像标记为灰度图像(我的是),但Win7将其标记为RGB图像。这似乎是问题的症状,但我对图像格式和色彩空间知之甚少,无法对此发表权威。

更新(2014-06-13):

在继续遇到这个问题之后,我进一步研究了一下,在PDFSharp论坛上发现了一个帖子,提到了这个问题并链接到另一个帖子并修复了。

http://msdn.microsoft.com/en-us/library/system.drawing.image.flags.aspx

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

基本上,PdfImage.FaxEncode.cs文件中有两种方法需要更新。

CountOneBits()CountZeroBits()方法中,请替换以下代码:

return found + hits;

found += hits;
if (found >= bitsLeft)
  return bitsLeft;
return found;
相关问题