0

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

4

1 回答 1

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。在查看了 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;
于 2012-02-01T15:04:24.753 回答