1

更新:画像生成を問題を解決する代替手段(PDFから画像)に置き換えましたが、これが可能かどうかを理解したいので、この質問を開いたままにします.

http://www.cloudformatter.comの Web サイトで、生成された XPS ファイルを処理して画像化するためのコードを実装しようとしていました。VisualBrush リソースを介して XPS ドキュメントに含まれるページ内の SVG を除いて、ほとんどすべてがうまく機能します。

ここのコードと、Web XPS に関する他のいくつかのコードからインスピレーションを得て、イメージを作成しました。

以下は、その Web サイトを介した REST 応答用のページ イメージのパッケージを作成するコンバーターのコードです。XPS は問題なく、ほとんどすべてのページが画像に対して期待どおりに機能するため、コードは現在、ページ内の SVG を除くすべてに対して機能します。ダウンロード用の XPS を生成する同じコードが、以下のコードに供給されるストリームを生成するため、ストリームが壊れないように注意する必要があります。デバッグでビジュアルを調べても、VisualBrush オブジェクトの存在が示されます。

このページは完璧です (SVG 画像はありません) [「PNG を埋め込む」オプションと「XPS をダウンロードする」オプションをクリックすると、それらは正しいものになります。

http://www.cloudformatter.com/CSS2Pdf.APIDoc.Usage

しかし、このページには SVG があります:

http://www.cloudformatter.com/CSS2Pdf.SVGCharts.HighCharts

ダウンロード XPS は完璧です。ただし、以下のコードで PNG を取得すると、SVG が失われます。再度注意してください: バックエンドに実装されているシステムは、現在、PDF から画像への実用的なソリューションを見つけたため、以下のコードを使用していません。ただし、私たちが抱えている XPS to image の問題を解決したいと考えています。XPSにはこれがあります:

<Path>
            <Path.Fill>
                <VisualBrush Visual="{StaticResource svg0}" Viewbox="0,0,432.0,222.0"
                    Viewport="0,0,432.0,222.0" ViewportUnits="Absolute" ViewboxUnits="Absolute"
                />
            </Path.Fill>
            <Path.Data>
                <PathGeometry>
                    <PathFigure IsClosed="true" StartPoint="0,0">
                        <PolyLineSegment Points="0,0 432.0,0 432.0,222.0 0,222.0"/>
                    </PathFigure>
                </PathGeometry>
            </Path.Data>
        </Path>

そしてリソースにはこれがあります:

 ResourceDictionary xmlns="http://schemas.microsoft.com/xps/2005/06"
xmlns:x="http://schemas.microsoft.com/xps/2005/06/resourcedictionary-key">
<Canvas RenderTransform="1,0,0,1,0,0" x:Key="svg0">
    <Canvas RenderTransform="1.0,0.0,0.0,-1.0,0.0,222.0">
        <Canvas.Clip>
            <PathGeometry Figures="M 0.0,0.0 L 0.0,222.0 L 432.0,222.0 L 432.0,0.0 L 0.0,0.0 z "
            />
        </Canvas.Clip>
        <Path Fill="#ffffff" Data="M 0.0,0.0 L 0.0,222.0 L 432.0,222.0 L 432.0,0.0 L 0.0,0.0 z "/> 
 <!--snipped-->

コードは以下です。この方法でページのビジュアルを取得することはできませんか?

private static List<byte[]> XPStoIMG(Stream xpsStream)
    {
        xpsStream.Seek(0, SeekOrigin.Begin);

        List<byte[]> pages = new List<byte[]>();

        MemoryStream imgStream = new MemoryStream();
        var mt = new MultiThreader("single_thread", true);
        mt.Run(delegate()
        {
            using (Package package = Package.Open(xpsStream))
            {
                string inMemoryPackageName = "memorystream://myXps.xps";
                Uri packageUri = new Uri(inMemoryPackageName);
                PackageStore.AddPackage(packageUri, package);
                XpsDocument xpsDoc = new XpsDocument(package, CompressionOption.Maximum, inMemoryPackageName);

                FixedDocumentSequence seq = xpsDoc.GetFixedDocumentSequence();
                DocumentPaginator paginator = seq.DocumentPaginator;
                for (int page = 0; page < paginator.PageCount; page++)
                {
                    DocumentPage docPage = paginator.GetPage(page);
                    RenderTargetBitmap bmp = new RenderTargetBitmap((int)docPage.Size.Width * 120 / 96, (int)docPage.Size.Height * 120 / 96, 120d, 120d, PixelFormats.Default);
                    bmp.Render(docPage.Visual);
                    PngBitmapEncoder png = new PngBitmapEncoder();
                    png.Frames.Add(BitmapFrame.Create(bmp));
                    MemoryStream pstream = new MemoryStream();
                    png.Save(pstream);
                    pstream.Flush();
                    pstream.Seek(0, SeekOrigin.Begin);
                    byte[] parr = new byte[pstream.Length];
                    pstream.Read(parr, 0, Convert.ToInt32(pstream.Length));
                    pages.Add(parr);
                }
                PackageStore.RemovePackage(packageUri);
                xpsDoc.Close();
            }
        }, System.Threading.ApartmentState.STA);
        mt.Start();
        mt.CurrentThread.Join();
        return pages;
    }
4

1 に答える 1