重新序列化Xps文档时丢失图像

时间:2012-04-17 09:08:48

标签: c# .net wpf xps

我遇到了一个问题,即我使用此代码将水印应用于Xps文档中的每个页面。

    private static XpsDocument AddWatermark(string watermark, Package container, XpsDocument xpsOld)
    {
        // Open original XPS document    
        FixedDocumentSequence seqOld = xpsOld.GetFixedDocumentSequence();

        // Create new XPS document
        Uri u = new Uri("pack://TemporaryPackageUri.xps");

        try
        {                
            PackageStore.RemovePackage(u);
        }
        catch { }

        PackageStore.AddPackage(u, container);
        var newdoc = new XpsDocument(container, CompressionOption.Maximum, u.AbsoluteUri);

        XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(newdoc);

        // Needed for writing multiple pages

        SerializerWriterCollator vxpsd = writer.CreateVisualsCollator();

        int pageno = 1;

        foreach (DocumentReference r in seqOld.References)
        {
            FixedDocument d = r.GetDocument(false);

            // Walk through each page

            foreach (PageContent pc in d.Pages)
            {
                FixedPage fixedPage = pc.GetPageRoot(false);

                double width = fixedPage.Width;
                double height = fixedPage.Height;
                Size sz = new Size(width, height);

                // Convert to WPF Visual

                fixedPage.Measure(sz);
                fixedPage.Arrange(new Rect(new Point(), sz));
                fixedPage.UpdateLayout();

                ContainerVisual newpage = new ContainerVisual();
                newpage.Children.Add(fixedPage);

                if (!string.IsNullOrEmpty(watermark))
                {
                    newpage.Children.Add(CreateWatermark(width, height, watermark + " (" + pageno + ")"));
                }

                pageno++;

                // Write out modified page
                vxpsd.Write(newpage);

            }
        }

        vxpsd.EndBatchWrite();

        container.Flush();

        // this part serializes the doc to a stream so we can get the bytes
        var ms = new MemoryStream();
        var writerx = new XpsSerializerFactory().CreateSerializerWriter(ms);
        writerx.Write(newdoc.GetFixedDocumentSequence());            

        xpsOld.Close();

        return newdoc;
    }

它基本上将一个Xps文档作为参数并遍历每个页面,创建一个视觉效果并在其上添加对角线水印。

我遇到的问题是它丢失了原始Xps中嵌入的图像。

有什么我想念的吗?像我需要复制的一系列嵌入式资源?

任何帮助表示感谢,我对Xps文档并不熟悉。

编辑1:这实际上是导致问题的方法

 public static void PrintFlowDocument(PrintQueue printQueue, DocumentPaginator document, string watermark)
    {
        MemoryStream lMemoryStream = new MemoryStream();
        Package package = Package.Open(lMemoryStream, FileMode.Create);
        Uri u = new Uri("pack://TempTemporaryPackageUri.xps");
        PackageStore.AddPackage(u, package);
        XpsDocument doc = new XpsDocument(package, CompressionOption.NotCompressed, "pack://TempTemporaryPackageUri.xps");

        XpsDocumentWriter xpsDocumentWriter = PrintQueue.CreateXpsDocumentWriter(printQueue);
        xpsDocumentWriter.Write(doc.GetFixedDocumentSequence());          

        PackageStore.RemovePackage(u);
    }

这是调用addwatermark函数的函数(虽然我省略了以避免混淆)。我正在做的就是创建一个新的xps并将Document序列添加到它(在添加和缩放水印之后)。

在此之后,嵌入式XpsImage是1x1黑色像素......大概是因为我需要复制资源(感谢Jon)。

有关如何完成此操作的任何建议?

由于

2 个答案:

答案 0 :(得分:0)

添加水印后应添加fixedPage.UpdateLayout()。

答案 1 :(得分:0)

您似乎跳过了复制所有资源并打印过票。但一般情况下,您应该尝试修改现有文档,而不是创建一个新副本。