Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在XAML生成的XPS中嵌入JPEG图像?_C#_Wpf_Xaml_Xps - Fatal编程技术网

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

C# 如何在XAML生成的XPS中嵌入JPEG图像?,c#,wpf,xaml,xps,C#,Wpf,Xaml,Xps,我正在使用该类动态生成一个XPS文件。在我的XAML模板中,我将JPEG图像嵌入到一个容器中但是,生成的XPS中的嵌入图像始终是PNG图像——这导致特定类型图像的文件非常大 文档编写器似乎将渲染图像解释为位图,然后将其保存为PNG 下面是生成XPS的代码: void ConvertToXps(IEnumerable<FixedDocument> fixedDocuments, Stream outputStream) { var package = Package.Open(

我正在使用该类动态生成一个
XPS
文件。在我的
XAML
模板中,我将
JPEG
图像嵌入到一个容器中但是,生成的
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();
}
void ConvertToXps(IEnumerable fixedDocuments,Stream outputStream)
{
var package=package.Open(outputStream,FileMode.Create);
var xpsDoc=新的XpsDocument(package,CompressionOption.Normal);
var xpsWriter=XpsDocument.CreateXpsDocumentWriter(xpsDoc);
//XPS文档是使用固定的文档序列构建的。
var fixedDocSeq=新的FixedDocumentSequence();
//A4=210 x 297毫米=8.267 x 11.692英寸=793.632*1122.432点
fixedDocSeq.DocumentPaginator.PageSize=新尺寸(793.6321122.432);
foreach(固定文档中的固定文档变量)
{
var docRef=新文档引用();
docRef.BeginInit();
docRef.SetDocument(固定文档);
docRef.EndInit();
((IAddChild)fixedDocSeq.AddChild(docRef);
}
//将我们的固定文档写入XPS。
xpsWriter.Write(fixedDocSeq.DocumentPaginator);
xpsDoc.Close();
package.Close();
}

Q:我如何强制我的
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

很有意义。如果从
XAML
创建
FixedDocument
,然后使用
XamlReader.Parse
读取,是否可以获取此
IXpsFixedPageWriter
?理想情况下,我需要一个回调,解析器在遇到图像时询问我该怎么做。我不是100%确定,但我不这么认为。我认为在.Net Framework中没有任何东西可以编辑现有的XPS,而这正是您要做的。您基本上可以创建XPS,但创建后它将是只读的。在这种情况下,
FixedPage
确实必须在代码隐藏中创建。除非有聪明的方法钩住XAML解析器并覆盖对
AddImage
的内部调用。这种方法的一个优点是,如果您需要特定的格式和诸如此类的内容,您将在生成的文档方面拥有更大的灵活性。您找到了一个聪明而优雅的解决方案!