14

XPSをWPFで変換しようとしています。

アイデアは、これらの画像にSilverlight 4をロードできるということです。このために、次のコードを使用しています。

 // XPS Document
            XpsDocument xpsDoc = new XpsDocument(xpsFileName, System.IO.FileAccess.Read);
            FixedDocumentSequence docSeq = xpsDoc.GetFixedDocumentSequence();

        // The number of pages
        PageCount = docSeq.References[0].GetDocument(false).Pages.Count;

        DocumentPage sizePage = docSeq.DocumentPaginator.GetPage(0);
        PageHeight = sizePage.Size.Height;
        PageWidth = sizePage.Size.Width;
        // Scale dimensions from 96 dpi to 600 dpi.
        double scale = 300/ 96;

        // Convert a XPS page to a PNG file
        for (int pageNum = 0; pageNum < PageCount; pageNum++)
        {
            DocumentPage docPage = docSeq.DocumentPaginator.GetPage(pageNum);
            BitmapImage bitmap = new BitmapImage();
            RenderTargetBitmap renderTarget =
                new RenderTargetBitmap((int)(scale * (docPage.Size.Height + 1)),
                                                               (int)(scale * (docPage.Size.Height + 1)),
                                                               scale * 96,
                                                               scale * 96, PixelFormats.Pbgra32);
            renderTarget.Render(docPage.Visual);


            PngBitmapEncoder encoder = new PngBitmapEncoder();

            encoder.Frames.Add(BitmapFrame.Create(renderTarget));

            FileStream pageOutStream = new FileStream(name + ".Page" + pageNum + ".png", FileMode.Create, FileAccess.Write);
            encoder.Save(pageOutStream);
            pageOutStream.Close();

このコードは、XPSドキュメントを変換するプロジェクトhttp://xpsreader.codeplex.com/から取得されます。よく働く!しかし、問題は、画像が低解像度でぼやけていることです。私はRenderTargetBitmapを調べて見つけ、このページで見つけました:http: //www.codeproject.com/Questions/213737/Render-target-bitmap-quality-issues

ここでの問題は、ハードウェアRenderTargetBitmapレンダリングを使用していないことです。

1つの解決策は、DirectXとWPFを使用してこれを行うことですが、それを行う正しい方法を示す明確な例は見つかりませんでした。

提案に感謝します。前もって感謝します。

更新:XPSドキュメントを添付しました。画像を変換しようとしてい ます。test.xpsをダウンロードしてください。

4

4 に答える 4

7

xps を画像に変換する sourceforge.net に xps2img という名前のプロジェクトがあります。これは C# で作成され、ソース コードも含まれています。見てみな。あなたが望むものを達成するのに役立ちます。

http://sourceforge.net/projects/xps2img/files/

于 2012-01-27T12:15:32.750 に答える
6

この投稿や他の多くの投稿で、DocumentPage を Image に変換して HDD に保存する際に問題が発生することがわかりました。この方法では、ドキュメント ビューアーからすべてのページを取得し、HDD に jpg 画像として保存します。

public void SaveDocumentPagesToImages(IDocumentPaginatorSource document, string dirPath)
    {
        if (string.IsNullOrEmpty(dirPath)) return;

        if (dirPath[dirPath.Length - 1] != '\\')
            dirPath += "\\";

        if (!Directory.Exists(dirPath)) return;

        MemoryStream[] streams = null;
        try
        {
            int pageCount = document.DocumentPaginator.PageCount;
            DocumentPage[] pages = new DocumentPage[pageCount];
            for (int i = 0; i < pageCount; i++)
                pages[i] = document.DocumentPaginator.GetPage(i);

            streams = new MemoryStream[pages.Count()];

            for (int i = 0; i < pages.Count(); i++)
            {
                DocumentPage source = pages[i];
                streams[i] = new MemoryStream();

                RenderTargetBitmap renderTarget =
                   new RenderTargetBitmap((int)source.Size.Width,
                                           (int)source.Size.Height,
                                           96, // WPF (Avalon) units are 96dpi based
                                           96,
                                           System.Windows.Media.PixelFormats.Default);

                renderTarget.Render(source.Visual);

                JpegBitmapEncoder encoder = new JpegBitmapEncoder();  // Choose type here ie: JpegBitmapEncoder, etc
                encoder.QualityLevel = 100;
                encoder.Frames.Add(BitmapFrame.Create(renderTarget));

                encoder.Save(streams[i]);

                FileStream file = new FileStream(dirPath + "Page_" + (i+1) + ".jpg", FileMode.CreateNew);
                file.Write(streams[i].GetBuffer(), 0, (int)streams[i].Length);
                file.Close();

                streams[i].Position = 0;
            }
        }
        catch (Exception e1)
        {
            throw e1;
        }
        finally
        {
            if (streams != null)
            {
                foreach (MemoryStream stream in streams)
                {
                    stream.Close();
                    stream.Dispose();
                }
            }
        }
    }
于 2013-02-15T17:45:22.430 に答える
2

xps2img に基づく nuget パッケージが利用可能になりました: https://www.nuget.org/packages/xps2img/

ここで利用可能な API: https://github.com/peters/xps2img#usage

于 2013-09-28T15:14:56.887 に答える