重新序列化 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的黑色像素...大概是因为我需要将资源(谢谢乔恩)复制到它。
关于我如何完成此操作的任何建议?
谢谢
添加水印后,您应该添加一个 fixedPage.UpdateLayout()。
看起来您跳过了复制所有资源并打印票证。但一般来说,您应该尝试修改现有文档,而不是创建一个作为副本的新文档。