2008-12-09 7 views
17

Я хотел бы создать документ XPS для хранения и печати.Как создать документ XPS?

Что такое самый простой способ создать документ XPS (например, с простой сеткой с некоторыми данными внутри) в моей программе и передать его?

+0

Это также может помочь: [http://blogs.msdn.com/fyuan/archive/2005/09/12/463887.aspx](http://blogs.msdn.com/fyuan/archive/2005/ 09/12/463887.aspx) – noesgard 2008-12-11 09:29:56

ответ

11

Ничего просто об этом. Но это может быть сделано. У меня есть (к сожалению, все еще багги) пример кода и информация о моем блоге для создания документа в памяти.

Вот код, который я взбивал для тестирования, который инкапсулирует все (он записывает коллекцию FixedPages в документ XPS в памяти). Она включает в себя код для сериализации документа в массив байтов, но вы можете пропустить эту часть и просто вернуть документ:

public static byte[] ToXpsDocument(IEnumerable<FixedPage> pages) 
{ 
    // XPS DOCUMENTS MUST BE CREATED ON STA THREADS!!! 
    // Note, this is test code, so I don't care about disposing my memory streams 
    // You'll have to pay more attention to their lifespan. You might have to 
    // serialize the xps document and remove the package from the package store 
    // before disposing the stream in order to prevent throwing exceptions 
    byte[] retval = null; 
    Thread t = new Thread(new ThreadStart(() => 
    { 
     // A memory stream backs our document 
     MemoryStream ms = new MemoryStream(2048); 
     // a package contains all parts of the document 
     Package p = Package.Open(ms, FileMode.Create, FileAccess.ReadWrite); 
     // the package store manages packages 
     Uri u = new Uri("pack://TemporaryPackageUri.xps"); 
     PackageStore.AddPackage(u, p); 
     // the document uses our package for storage 
     XpsDocument doc = new XpsDocument(p, CompressionOption.NotCompressed, u.AbsoluteUri); 
     // An xps document is one or more FixedDocuments containing FixedPages 
     FixedDocument fDoc = new FixedDocument(); 
     PageContent pc; 
     foreach (var fp in pages) 
     { 
      // this part of the framework is weak and hopefully will be fixed in 4.0 
      pc = new PageContent(); 
      ((IAddChild)pc).AddChild(fp); 
      fDoc.Pages.Add(pc); 
     } 
     // we use the writer to write the fixed document to the xps document 
     XpsDocumentWriter writer; 
     writer = XpsDocument.CreateXpsDocumentWriter(doc); 
     // The paginator controls page breaks during the writing process 
     // its important since xps document content does not flow 
     writer.Write(fDoc.DocumentPaginator); 
     // 
     p.Flush(); 

     // this part serializes the doc to a stream so we can get the bytes 
     ms = new MemoryStream(); 
     var writer = new XpsSerializerFactory().CreateSerializerWriter(ms); 
     writer.Write(doc.GetFixedDocumentSequence()); 

     retval = ms.ToArray(); 
    })); 
    // Instantiating WPF controls on a MTA thread throws exceptions 
    t.SetApartmentState(ApartmentState.STA); 
    // adjust as needed 
    t.Priority = ThreadPriority.AboveNormal; 
    t.IsBackground = false; 
    t.Start(); 
    //~five seconds to finish or we bail 
    int milli = 0; 
    while (buffer == null && milli++ < 5000) 
     Thread.Sleep(1); 
    //Ditch the thread 
    if(t.IsAlive) 
     t.Abort(); 
    // If we time out, we return null. 
    return retval; 
} 

Примечание дерьмовый код нарезание резьбы. Вы не можете делать это в потоках MTA; если вы находитесь в потоке STA, вы также можете избавиться от этого.

+1

Интересный код тайм-кода ничьей - по какой-то причине вы не просто использовали t.Join (5000) вместо этого? Я все еще пытаюсь понять все остальное :) – Sam 2008-12-09 12:30:54

-1

Все, это действительно XML. Если вам удобно работать с файлами XML, у вас не должно возникнуть проблемы с работой с документами XPS. Вот простой учебник, я использовал в прошлом, чтобы меня начали:

http://blogs.ocrasoft.nl/jeroenveurink/?p=21

+0

Bizarre. Но определенно один из способов сделать это. Я бы не предложил сделать это таким образом, если вы не поняли спецификации документа XPS. – Will 2008-12-09 12:15:50

+0

Создание причудливого XML-документа, сжатого в zip-файл? Не совсем то, что я имел в виду, когда писал «самый простой способ» :) – Sam 2008-12-09 12:24:33

4

Если вы работаете в .NET (v2 или новее), вы можете легко создать действительный документ XPS из визуализации WPF.

Для примера, взгляните на этом блоге мой:

http://nixps.blogspot.com/2008/12/wpf-to-pdf.html

В примере я создаю WPF визуального и преобразовать его в файл XPS, прежде чем делать дальнейшую обработку.

Если вы не работаете в .NET или хотите получить больше контроля над выходом XPS, я бы посоветовал вам использовать библиотеку (например, NiXPS SDK). Это гораздо проще для кода и гораздо меньше ошибок, чем сами записи XML-конструкций (и правильное управление ресурсами и т. Д.).

Смежные вопросы