none
FixDocumentの印刷時に文字化けする(場合がある) RRS feed

  • 質問

  • WPF のアプリケーションでxpsファイルを作成し、印刷しているのですが

    結構な頻度で文字化けを起こしてしまいます。

    ・同じ帳票でも文字化けする場合としない時がある。

    ・2枚目、3枚目と続く文字化けしやすい

    という点からメモリの問題かと怪しんでいるのですが、同じようになった方や、よい対策方法があれば教えて頂けないでしょうか

    尚、環境とソースは下記の通りです

    【環境】

    Windows8 32bit  メモリ2G Intel CPU Z2760 @1.80GHz

    Epsoon レーザプリンタ (ドライバはインストールを行い、テスト印刷は正常でした)

    A4 サイズの帳票を 1枚 ~ 最大 16枚

    CanvasのファイルをXPSファイルに変換した後、そのファイルを読んで

    印刷しています。

    【出力ソース】

     Dim packageUri = New Uri(filePath) ← 印刷するXPSファイルのあるパス
                Try
                    Dim xpsStream As MemoryStream = New MemoryStream
                    Dim xpsPackage As Package = Package.Open(xpsStream, FileMode.Create, FileAccess.ReadWrite)

                    PackageStore.AddPackage(packageUri, xpsPackage)
                    Dim xps As Xps.Packaging.XpsDocument = New Xps.Packaging.XpsDocument(xpsPackage, CompressionOption.NotCompressed, packageUri.AbsoluteUri)

                    Dim xpsWriter As Xps.XpsDocumentWriter = Windows.Xps.Packaging.XpsDocument.CreateXpsDocumentWriter(xps)
                    xpsWriter.Write(prmDoc)

                    Dim PrintQueue As Printing.PrintQueue = GetPrintQueue(PrintName)←出力に使用するプリント情報を取得しています
                    Dim PrintTicket As New Printing.PrintTicket()
                    PrintTicket.PageOrientation = PrintOrient  ← 印刷方向を指定
                    PrintTicket.CopyCount = PrintCount     ← 印刷枚数を指定

                    Dim printWriter As Xps.XpsDocumentWriter = Printing.PrintQueue.CreateXpsDocumentWriter(PrintQueue)
                    printWriter.Write(xps.GetFixedDocumentSequence(), PrintTicket)

                Finally
                    PackageStore.RemovePackage(packageUri)
                End Try

    2013年4月19日 10:35

回答

  • あなたのプログラムではなく、標準の XPS ビューアで印刷しても再現するのですよね?そうであれば、Microsoft に問い合わせるべきではないでしょうか。

    XPS ビューアで正常に表示される以上、XPS としてはある程度以上、正しいデータが格納されていると推定できます。
    その上で、印刷した際に都合が悪い部分は、XPS ビューアの実装上の問題か、XPS 出力のソフトウェアの問題か、プリンターの相性が疑われます。
    この場合、プリンターへの出力相当しか実装していないプログラマーにとっては、手立てがありません。

    従って、Microsoft の技術サポートを使って、原因の究明、あるいは回避策の提案を受けることがもっとも効率的なやり方でしょう。
    (第三者には、再現できる環境もないわけですし、XPS ビューアの実装に詳しくもないわけですし、回答することが困難です)

    • 編集済み AzuleanMVP 2013年4月22日 13:52
    • 回答としてマーク 星 睦美 2013年4月24日 6:01
    2013年4月22日 13:51
  • 自己解決です(あくまで暫定処置ですが)

    複数枚のレポートを1つのFixDocumentにまとめて出力すると

    2枚目以降からよく発生する為、

    複数枚のレポートは複数のFixDocumentにして

    出力するように変更しました。

    これで5-6枚位の帳票なら、何とか文字化けせずに出力します。

    あくまで少し出にくくなっただけで、根本的な解決ではないのですが・・

    皆さまありがとうございました。

    • 回答としてマーク VbBeginer001 2013年4月25日 8:05
    2013年4月25日 8:05

すべての返信

  • ソースコードを見た限り、MemoryStreamやXPSDocument等の解放処理が入っていませんので、どこかでリークしてる可能性があります。
    IDisposableが実装されているクラスをUsingステートメントで囲ってみてはどうでしょうか。

    こんな感じです。

            Dim packageUri = New Uri(filePath)
            Try
                Using xpsStream As MemoryStream = New MemoryStream
                    Using xpsPackage As Package = Package.Open(xpsStream, FileMode.Create, FileAccess.ReadWrite)
                        PackageStore.AddPackage(packageUri, xpsPackage)
                        Using xps As Xps.Packaging.XpsDocument = New Xps.Packaging.XpsDocument(xpsPackage, CompressionOption.NotCompressed, packageUri.AbsoluteUri)
                            Dim xpsWriter As Xps.XpsDocumentWriter = Windows.Xps.Packaging.XpsDocument.CreateXpsDocumentWriter(xps)
                            xpsWriter.Write(prmDoc)
    
                            Using PrintQueue As Printing.PrintQueue = GetPrintQueue(PrintName)
                                Dim PrintTicket As New Printing.PrintTicket()
                                PrintTicket.PageOrientation = PrintOrient
                                PrintTicket.CopyCount = PrintCount
    
                                Dim printWriter As Xps.XpsDocumentWriter = Printing.PrintQueue.CreateXpsDocumentWriter(PrintQueue)
                                printWriter.Write(xps.GetFixedDocumentSequence(), PrintTicket)
                            End Using
                        End Using
                    End Using
                End Using
            Catch ex As Exception
    
            Finally
                PackageStore.RemovePackage(packageUri)
            End Try
    
    とりあえず入れれる所全部Using入れてますけど、ざっと見た限り怪しいのはMemoryStreamとPrintQueueですかね・・・
    以上、参考まで。
    • 回答の候補に設定 星 睦美 2013年4月22日 0:14
    • 回答の候補の設定解除 星 睦美 2013年4月22日 4:05
    2013年4月19日 12:20
  • みっとさん、ご回答ありがとうございます。

    早速試してみたのですが、状況は改善されませんでした><

    印刷プログラムが悪いのか(おそらくこちらなのでしょうが)、Windows8だからなのか(Windows7では、今のところ問題無くでています。)

    困り果ててます

    2013年4月22日 1:42
  • すいません、先程XPSファイルを確認した処

    XPS自体→ 文字化けしない

    XPSビューアで開いて印刷 → 文字化け

    という現象になりました。

    どうやら印刷の出力プログラムではないようです。

    とはいったもののどのようにすれば文字化けせず出力できるのでしょうか

    2013年4月22日 3:11
  • あなたのプログラムではなく、標準の XPS ビューアで印刷しても再現するのですよね?そうであれば、Microsoft に問い合わせるべきではないでしょうか。

    XPS ビューアで正常に表示される以上、XPS としてはある程度以上、正しいデータが格納されていると推定できます。
    その上で、印刷した際に都合が悪い部分は、XPS ビューアの実装上の問題か、XPS 出力のソフトウェアの問題か、プリンターの相性が疑われます。
    この場合、プリンターへの出力相当しか実装していないプログラマーにとっては、手立てがありません。

    従って、Microsoft の技術サポートを使って、原因の究明、あるいは回避策の提案を受けることがもっとも効率的なやり方でしょう。
    (第三者には、再現できる環境もないわけですし、XPS ビューアの実装に詳しくもないわけですし、回答することが困難です)

    • 編集済み AzuleanMVP 2013年4月22日 13:52
    • 回答としてマーク 星 睦美 2013年4月24日 6:01
    2013年4月22日 13:51
  • フォーラム オペレーターの星 睦美です。

    みっと さん、Azulean さん 回答ありがとうございます。

    VbBeginer001 さん、こんにちは

    私のほうでも同様の事象がないか調べてみましたが、
    事象の発生が「同じ帳票でも文字化けする場合としない時がある」に該当する例は見つけることができませんでした。同じプログラムでも「Windows 7では、今のところ問題無くでています」とのことで、Windows 8 と関連がある問題でしょうか。

    Windows 7 と異なっている点ではWindows 8ではOpenXPS (拡張子 .oxps )形式が既定になっていますので、ファイル形式がXPS かOXPSか、プリンターがOXPS に対応しているかどうかなどが気になりました。

    Azulean さんの返信にありますように調査していただいて原因を見つけにくい場合は、もしよろしければマイクロソフトのサポート窓口(有償)へのお問い合わせを検討いただければと思います。

    それでは、今後ともフォーラムをよろしくお願いします。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年4月24日 5:59
  • 色々な方にご回答頂いてるなか 返信出来なくて申し訳ありません。

    現在、ファイルが悪いのか、プリンタなのか、端末の環境なのか

    色々と機器を変えて検証しております。

    もう少し限定できれば改めてお問い合わせさせて頂ければと思います。

    皆様 ありがとうございました

    2013年4月24日 8:12
  • 自己解決です(あくまで暫定処置ですが)

    複数枚のレポートを1つのFixDocumentにまとめて出力すると

    2枚目以降からよく発生する為、

    複数枚のレポートは複数のFixDocumentにして

    出力するように変更しました。

    これで5-6枚位の帳票なら、何とか文字化けせずに出力します。

    あくまで少し出にくくなっただけで、根本的な解決ではないのですが・・

    皆さまありがとうございました。

    • 回答としてマーク VbBeginer001 2013年4月25日 8:05
    2013年4月25日 8:05