【问题标题】:Converting TIFF to PDF results in Insufficient Data For Image将 TIFF 转换为 PDF 导致图像数据不足
【发布时间】:2012-01-25 15:12:59
【问题描述】:

我有一个实用程序,可以使用 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 中的操作系统级别错误有关。任何人都可以确认这一点或提供解决方法?

【问题讨论】:

  • 哪个 PDFsharp 版本,哪个版本?如果您当前使用 WPF 构建,请尝试 GDI+ 构建(反之亦然)以检查问题是否在两个构建中都出现。哪个 Windows 版本?
  • @PDFsharpTeam 我在 Windows 7 上使用 PDFsharp 版本 1.31 GDI+。
  • @PDFsharpTeam 我也尝试过使用 WPF 构建,但遇到了同样的问题。
  • 使用 PDFSharp 的过程是否必须对图像进行解码和重新编码?看起来可能是由于“绘制”功能。我编写了一个命令行实用程序来执行非常高效的相同操作(无需解码/重新编码,只需重新打包图像数据)。如果您想试一试,请与我联系;你可以成为代码的免费测试者。
  • 解决 Windows 7 错误的最佳方法:使用 Windows XP。说真的:PDFsharp 使用操作系统读取图像文件(因此受益于 Windows 支持的各种格式),但在 Windows 7 中它们引入了错误(某些 JPEG 文件没有正确处理,现在 TIFF 文件似乎有问题,也)。

标签: pdf pdf-generation tiff pdfsharp


【解决方案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。在查看了 flags 属性的 MSDN 文档后 (http://msdn.microsoft.com/en-us/library/system.drawing.image.flags.aspx) ,区别在于WinXP将图像标记为灰度图像(我的是),但Win7将其标记为RGB图像。这似乎是问题的征兆,但我对图像格式和色彩空间的了解还不够,无法就此与权威人士交谈。

更新(2014-06-13):

在继续遇到此问题后,我进一步研究并在 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;

【讨论】:

  • 是否有针对此错误的解决方案/解决方法?使用运行 Windows 7 的升级笔记本电脑的用户现在面临的应用程序存在同样的问题。
  • @techventure:我从来没有找到一个好的解决方案。在 Windows XP 上运行似乎是最好的解决方法。对于我们的一个使用 Windows 7 的客户,我们在 Windows XP 虚拟机中运行该应用程序,这似乎很好。 System.Drawing.Image 类有一个 PropertyItems 属性。如果您想进一步调查,此属性的内容在有效的图像和无效的图像之间也有所不同。
  • 我发现克隆图像(如果有多个页面,则每个页面一个)解决了这个问题。
猜你喜欢
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
相关资源
最近更新 更多