如何在 XAML 生成的 XPS 中嵌入 JPEG 图像?

How to embed JPEG images in XAML generated XPS?

我正在使用 XpsDocument class. In my XAML template I embed a JPEG image in an Image 容器即时生成一个 XPS 文件。 但是,生成的 XPS 中的嵌入图像总是 PNG 图像 - 导致某些类型的图像文件非常大。

文档编写者似乎将渲染图像解释为位图,然后将它们保存为 PNG

这是生成 XPS 的代码:

void ConvertToXps(IEnumerable<FixedDocument> fixedDocuments, Stream outputStream)
{
    var package = Package.Open(outputStream, FileMode.Create);
    var xpsDoc = new XpsDocument(package, CompressionOption.Normal);
    var xpsWriter = XpsDocument.CreateXpsDocumentWriter(xpsDoc);

    // XPS documents are built using fixed document sequences.
    var fixedDocSeq = new FixedDocumentSequence();

    // A4 = 210 x 297 mm = 8.267 x 11.692 inches = 793.632 * 1122.432 dots
    fixedDocSeq.DocumentPaginator.PageSize = new Size(793.632, 1122.432);

    foreach (var fixedDocument in fixedDocuments)
    {
        var docRef = new DocumentReference();
        docRef.BeginInit();
        docRef.SetDocument(fixedDocument);
        docRef.EndInit();
        ((IAddChild)fixedDocSeq).AddChild(docRef);
    }

    // Write out our fixed document to XPS.
    xpsWriter.Write(fixedDocSeq.DocumentPaginator);

    xpsDoc.Close();
    package.Close();
}

问: 如何强制我的 XAML 渲染图像在生成的 XPS 中保存为 JPEG

我认为您必须更改创建 XPS 文档的方式。

var package = Package.Open(outputStream, FileMode.Create);
var xpsDoc = new XpsDocument(package, CompressionOption.Normal);
var xpsWriter = xpsDoc.AddFixedDocumentSequence();

var fixedDocSeq = xpsDoc.GetFixedDocumentSequence();

// A4 = 210 x 297 mm = 8.267 x 11.692 inches = 793.632 * 1122.432 dots
fixedDocSeq.DocumentPaginator.PageSize = new Size(793.632, 1122.432);

foreach (var fixedDocument in fixedDocuments)
{
    var docWriter = xpsWriter.AddFixedDocument();

    var pageWriter = docWriter.AddFixedPage();

    var image = pageWriter.AddImage(XpsImageType.JpegImageType);

    Stream imageStream = image.GetStream();

    //Write your image to stream

    //Write the rest of your document based on the fixedDocument object
}

这里的关键是用 docWriter.AddFixedPage(); 获取 IXpsFixedPageWriter。这允许您重新创建文档,将图像添加到您想要的位置。

不幸的是,不确定您是否可以编辑已创建的 FixedDocument