【问题标题】:How to embed JPEG images in XAML generated XPS?如何在 XAML 生成的 XPS 中嵌入 JPEG 图像?
【发布时间】:2015-09-10 17:05:22
【问题描述】:

我正在使用XpsDocument 类即时生成XPS 文件。在我的XAML 模板中,我将JPEG 图像嵌入到Image 容器中。 但是,生成的 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();
}

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

【问题讨论】:

    标签: c# wpf xaml xps


    【解决方案1】:

    我认为您必须改变创建 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
    }
    

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

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

    【讨论】:

    • 有道理。如果FixedDocument 是从XAML 创建的,然后使用XamlReader.Parse 读取,是否可以获得这个IXpsFixedPageWriter?理想情况下,我想要一个回调,解析器在遇到图像时询问我该怎么做。
    • 我不是 100% 确定,但我不这么认为。我认为 .Net 框架中没有任何东西可以编辑现有的 XPS,而这正是您想要做的。您基本上可以创建 XPS,但一旦创建,它就是只读的。
    • 在这种情况下,FixedPage 确实必须在代码隐藏中创建。除非有一些巧妙的方法来挂钩 XAML 解析器并覆盖对 AddImage 的内部调用。
    • 这种方法的一个优点是,如果您需要特定的格式等等,您可以在生成的文档方面拥有更大的灵活性。
    • 您找到了一个聪明而优雅的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多