0

このコードを使用して、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 に感謝します)。

これを完了する方法について何か提案はありますか?

ありがとう

4

2 に答える 2

0

すべてのリソースのコピーとチケットの印刷をスキップしたようです。ただし、一般的には、コピーである新しいドキュメントを作成するのではなく、既存のドキュメントを変更するようにしてください。

于 2012-04-17T13:49:14.253 に答える
0

透かしを追加した後、fixedPage.UpdateLayout() を追加する必要があります。

于 2012-04-17T09:22:40.230 に答える