【问题标题】:Losing image when re-serialising Xps document重新序列化 Xps 文档时丢失图像
【发布时间】:2012-04-17 23:09:02
【问题描述】:

我遇到了一个问题,我使用此代码将水印应用于 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 黑色像素...大概是因为我需要将资源(感谢 Jon)复制到它。

对我如何完成这个有什么建议吗?

谢谢

【问题讨论】:

    标签: c# .net wpf xps


    【解决方案1】:

    你应该在添加水印之后添加一个fixedPage.UpdateLayout()。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是问题所在。新的 Xps 引用了 png 图像 (XpsImage),但它是 1px x 1px 黑色图像。我已经缩小了范围,这在我最初发布的 AddWatermark 方法中显然没有发生,而是通过重新序列化 xps 很简单。您能否就如何“复制”资源给我任何建议(我已经更新了问题)。谢谢。
      • @sambomartin 您是否出于某种原因尝试复制文档而不是修改现有文档?据推测,您可以简单地将水印内容添加到 FixedPage 的 Children 集合中。另一方面,如果你的水印只是一个字符串,为什么不使用 printticket 的 PageWatermark 功能呢?
      • PageWatermark 属性听起来不错。我会调查的。 tbh 我只涉足使用 Xps 从 WPF 打印,所以欢迎任何建议。谢谢
      • 你能给我一些 PageWatermark 功能的例子吗?找不到太多关于它的信息。它是打印作业的 .net 属性吗?
      • PageWatermark 似乎没有直接暴露在 .net 中。您必须打开 PrintTicket 的 xml 并直接对其进行修改。 PageWatermark 功能在PrintSchema spec 中定义
      猜你喜欢
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多