このコードを使用して、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 に感謝します)。
これを完了する方法について何か提案はありますか?
ありがとう