Как создать документ XPS?

По какой-то причине ответ Кандиде не строился. Это было полезно, однако, поскольку это заставило меня найти это, которое отлично работало:

System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke((Action)(() =>
    {
       //your code here...
    }));
18
задан Sam 9 December 2008 в 12:02
поделиться

3 ответа

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

Вот некоторый код, который я сделал на скорую руку для тестирования, которое инкапсулирует все (это пишет набор 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, можно избавиться от этого также.

14
ответ дан 30 November 2019 в 09:04
поделиться

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

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

-1
ответ дан 30 November 2019 в 09:04
поделиться

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

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

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

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

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

6
ответ дан 30 November 2019 в 09:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: