回答
什么都不轻松一下吧。但这是可以完成的。我在我的博客上有一些(可惜的是,仍然是越野车)示例代码和信息,用于在内存中创建文档。
下面是我为测试所掀起的一些代码,它封装了所有内容(它将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线程上,你也可以摆脱它。
有趣的线程超时代码 - 任何你没有使用t.Join(5000)的理由? 我仍然试图理解其他:) – Sam 2008-12-09 12:30:54
全部是,真的是XML。如果您愿意使用XML文件,那么在使用XPS文档时应该没有问题。这里有一个简单的教程中,我已经在过去用来让我开始:
如果您使用的是.NET(v2或更高版本),则可以非常方便地从WPF视觉效果中生成有效的XPS文档。
举一个例子,来看看我的这个博客帖子:
http://nixps.blogspot.com/2008/12/wpf-to-pdf.html
在这个例子中,我创建一个WPF视觉并将其转换为XPS文件,做进一步的处理之前。
如果你不是在.NET中工作,或者想要更多地控制XPS输出,那么我建议你使用一个库(如NiXPS SDK)。编写代码要容易得多,而且比自己编写XML结构(并进行适当的资源管理等)要少得多。
- 1. 如何即时创建xps文档?
- 2. CreateXpsDocumentWriter创建XPS或OXPS文档吗?
- 3. 如何验证XPS文档?
- 4. 如何静静地创建XPS文件?
- 5. 转换XPS文档
- 6. 问号XPS文档
- 7. 将XPS文档拆分为多个XPS文档
- 8. 如何在Access中显示XPS文档?
- 9. DOC到XPS文件文档
- 10. WPF - 创建非可视化XPS文档的示例
- 11. 从一个字节数组创建一个XPS文档
- 12. 如何在WCF服务中创建XPS文档来存储和返回?
- 13. XPS文档有多安全?
- 14. 如何创建OWL文档
- 15. 如何使用c#从网页创建xps文件?
- 16. 从XPS文档中提取文本
- 17. PDF到XPS通过Microsoft XPS文档写入
- 18. 使用XPS查看器打开FlowDocument作为XPS文档保存?
- 19. 从FlowDocument创建一个XPS文档,并将其附加在屏幕上
- 20. 截取PrintDialog到XPS文档编写器
- 21. 压缩现有的XPS文档
- 22. WPF和XPS:空文档查看器
- 23. 获取的由XPS文档作家
- 24. 在wpf中保存xps文档为.pdf
- 25. XPS - 使用图像打印文档
- 26. 静默使用Microsoft XPS Document Writer打印机创建XPS
- 27. 如何在创建父文档时自动创建引用的子文档?
- 28. 如何在WPF组件中显示无窗口XPS文档?
- 29. 如何在XPS文档中设置权限?
- 30. 如何设置Xps文档的页面大小?
这可能也有帮助:[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