0

PDFSharp ライブラリを使用して、TIFF 画像のバッチを PDF に変換するユーティリティがあります。次のコードは、実際の変換を実行します。生成された 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 のオペレーティング システム レベルのバグに関連しているようです。誰でもこれを確認したり、回避策を提供したりできますか?

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 に設定されます。フラグ プロパティに関する 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更新が必要なファイルには 2 つのメソッドがあります。

CountOneBits()メソッドとメソッドの両方でCountZeroBits()、次のコードを置き換えます。

return found + hits;

found += hits;
if (found >= bitsLeft)
  return bitsLeft;
return found;
于 2012-02-01T15:04:24.753 に答える