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

本文关键字:图像 文档 序列化 Xps | 更新日期: 2023-09-27 18:31:26

我遇到了一个问题,我使用此代码将水印应用于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 并向其中添加文档序列(在添加和缩放水印之后)。

在此之后,嵌入的XpsImage是一个1x1的黑色像素...大概是因为我需要将资源(谢谢乔恩)复制到它。

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

谢谢

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

添加水印后,您应该添加一个 fixedPage.UpdateLayout()。

看起来您跳过了复制所有资源并打印票证。但一般来说,您应该尝试修改现有文档,而不是创建一个作为副本的新文档。