Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XPS到位图转换中的Visual中未包含VisualBrush资源_C#_Xps_Xpsdocument_Visualbrush_Css To Pdf - Fatal编程技术网

C# XPS到位图转换中的Visual中未包含VisualBrush资源

C# XPS到位图转换中的Visual中未包含VisualBrush资源,c#,xps,xpsdocument,visualbrush,css-to-pdf,C#,Xps,Xpsdocument,Visualbrush,Css To Pdf,更新:我们用解决问题的替代方案(PDF到图像)替换了图像生成,但我将保留这个问题,因为我想了解这是否可行 在我们的网站上,我们试图实现一些代码,用于将生成的XPS文件处理为图像。除了通过VisualBrush资源包含在XPS文档中的页面中的SVG之外,其他大多数都可以正常工作 我们从这里的代码和网络上的其他一些代码中获取信息 下面是我们转换器的代码,它正在为通过该网站的REST响应构建一个页面图像包。XPS很好,大多数页面都可以像预期的那样为图像工作,因此代码目前可以为页面中除SVG之外的所有

更新:我们用解决问题的替代方案(PDF到图像)替换了图像生成,但我将保留这个问题,因为我想了解这是否可行

在我们的网站上,我们试图实现一些代码,用于将生成的XPS文件处理为图像。除了通过VisualBrush资源包含在XPS文档中的页面中的SVG之外,其他大多数都可以正常工作

我们从这里的代码和网络上的其他一些代码中获取信息

下面是我们转换器的代码,它正在为通过该网站的REST响应构建一个页面图像包。XPS很好,大多数页面都可以像预期的那样为图像工作,因此代码目前可以为页面中除SVG之外的所有内容工作。我应该注意到,生成XPS供下载的代码生成的流馈送到下面的代码中,因此它不会被打断。即使在调试中检查VisualBrush,也会显示VisualBrush对象的存在

此页面非常完美(没有SVG图像)[单击“嵌入PNG”和“下载XPS”选项,它们是正确的

但此页面有以下内容:

下载XPS是完美的。但是使用以下代码获取PNG会导致SVG丢失。再次注意:后端实现的系统当前没有使用以下代码,因为我们找到了PDF到图像的工作解决方案。但是,我们希望解决XPS到图像的问题。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-->

资源具有以下特点:

<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-->
ResourceDictionary xmlns=”http://schemas.microsoft.com/xps/2005/06"
xmlns:x=”http://schemas.microsoft.com/xps/2005/06/resourcedictionary-key">
下面是代码。这样就不可能获得页面的视觉效果吗

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;
    }
私有静态列表XPStoIMG(流xpsStream)
{
xpsStream.Seek(0,SeekOrigin.Begin);
列表页=新列表();
MemoryStream imgStream=新的MemoryStream();
var mt=新的多线程程序(“单线程”,true);
mt.Run(委托()
{
使用(Package=Package.Open(xpsStream))
{
字符串inMemoryPackageName=“memorystream://myXps.xps";
Uri packageUri=新Uri(inMemoryPackageName);
AddPackage(packageUri,package);
XpsDocument xpsDoc=新XpsDocument(包,压缩选项。最大值,inMemoryPackageName);
FixedDocumentSequence=xpsDoc.GetFixedDocumentSequence();
DocumentPaginator paginator=序号DocumentPaginator;
对于(int page=0;page
部分。当您的
文档序列已修复时,您可以这样继续:

foreach (PageContent content in xps.GetFixedDocumentSequence().References.First().GetDocument(true).Pages) {
  FixedPage page = content.GetPageRoot(true);
  foreach (UIElement element in page.Children) {
    //... do what you want
  }
}

例如,您想要的部分可能是为页面
RenderOpen()创建
DrawingVisual
获取
绘图上下文
并将单个
元素
渲染到该上下文。完成后,您可以将整个收集的视觉效果渲染到
渲染目标位图

部分。当您获得
固定文档序列
时,您可以这样继续:

foreach (PageContent content in xps.GetFixedDocumentSequence().References.First().GetDocument(true).Pages) {
  FixedPage page = content.GetPageRoot(true);
  foreach (UIElement element in page.Children) {
    //... do what you want
  }
}

例如,您想要的部分可能是为页面
RenderOpen()创建
DrawingVisual
it获取
DrawingContext
并将单个
元素渲染到该上下文。完成后,您可以将整个收集的视觉效果渲染到
RenderTargetBitmap
好的。

tl;dr但您是否假设路径为.Data==SVG?因为格式相似,但不同。我不是100%确定ls,但我很确定这两种格式不是(总是)路径数据太长了,读不下去了。如果你选择下载XPS,那就很好了。我想做的是把XPS转换成图像。TL;DR,但是你假设PATH?DATA=SVG?因为格式相似,但不同。我不是100%。详细信息,但我很确定这两种格式并不(总是)彼此直接兼容。不。路径数据来自svg并正确地放入XPS。如果选择作为XPS下载,您可以看到这一点。这很好。我尝试的是将XPS转换为图像。