我正在尝试从Web应用程序生成多页XPS文档,并试图通过单击按钮来传输该文档。
公共类Class1 {
protected void btnGenerateLetter_OnClick(object sender, EventArgs e)
{
try
{
string sid = Request.Form["id"];
byte[] bytes = FlowDocumentToXPS(GenerateLetter(), 640, 800);
Response.Clear();
Response.ContentType = "application/vnd.ms-xpsdocument";
Response.AddHeader("Content-Disposition", "attachment; filename=document.xps");
Response.OutputStream.Write(bytes, 0, bytes.Length);
Response.Flush();
Response.Close();
}
catch (Exception ex)
{
}
}
private FlowDocument GenerateLetter()
{
FlowDocument flowDocument = new FlowDocument();
string Header = "Test Header Message";
string Body = "Content goes here";
string Footer = "Footer Text";
for (int i = 0; i < 3; i++)
{
Paragraph header = new Paragraph();
header.Margin = new System.Windows.Thickness(250, 100, 250, 10);
header.BreakPageBefore = true;
header.Inlines.Add(new Run(Header));
header.Inlines.Add(new LineBreak());
header.Inlines.Add(new LineBreak());
header.Inlines.Add(new LineBreak());
Paragraph body = new Paragraph();
body.Inlines.Add(new Run(Body));
body.Inlines.Add(new LineBreak());
body.Inlines.Add(new LineBreak());
Paragraph footer = new Paragraph();
footer.Inlines.Add(new Run(Footer));
flowDocument.Blocks.Add(header);
flowDocument.Blocks.Add(body);
flowDocument.Blocks.Add(footer);
}
return flowDocument;
}
public static byte[] FlowDocumentToXPS(FlowDocument flowDocument, int width, int height)
{
MemoryStream stream = new MemoryStream();
// create a package
using (Package package = Package.Open(stream, FileMode.CreateNew))
{
// create an empty XPS document
using (XpsDocument xpsDoc = new XpsDocument(package, CompressionOption.NotCompressed))
{
// create a serialization manager
XpsSerializationManager rsm = new XpsSerializationManager(new XpsPackagingPolicy(xpsDoc), false);
// retrieve document paginator
DocumentPaginator paginator = ((IDocumentPaginatorSource)flowDocument).DocumentPaginator;
// set page size
paginator.PageSize = new System.Windows.Size(width, height);
// save as XPS
rsm.SaveAsXaml(paginator);
rsm.Commit();
}
return stream.ToArray();
}
}
}
这对开发环境有好处。但是在不同的计算机上部署时会出现此错误。(IIS6)。
启动URI:C:\ Documents and Settings \ 050583b.syn \ Desktop \ document.xps 应用程序标识:
System.IO.FileFormatException:文件包含损坏的数据。
在MS.Internal.IO.Zip.ZipIOEndOfCentralDirectoryBlock.FindPosition(Stream archiveStream)
在MS.Internal.IO.Zip.ZipIOEndOfCentralDirectoryBlock.SeekableLoad(ZipIOBlockManager blockManager)
在MS.Internal.IO.Zip.ZipIOBlockManager.LoadEndOfCentralDirectoryBlock()
在MS.Internal.IO.Zip.ZipArchive..ctor(Stream archiveStream,FileMode模式,FileAccess访问,布尔流,布尔ownStream)
在MS.Internal.IO.Zip.ZipArchive.OpenOnStream(流媒体,FileMode模式,FileAccess访问,布尔流)
在System.IO.Packaging.ZipPackage..ctor(Stream s,FileMode模式,FileAccess访问,布尔流)
在System.IO.Packaging.Package.Open(Stream stream,FileMode packageMode,FileAccess packageAccess,Boolean streaming)
在System.IO.Packaging.Package.Open(Stream stream)
在MS.Internal.Documents.Application.TransactionalPackage..ctor(Stream original)
在MS.Internal.Documents.Application.PackageController.MS.Internal.Documents.Application.IDocumentController.Open(文档文档)
在MS.Internal.Documents.Application.DocumentManager.DispatchOpen(IDocumentController控制器,文档文档)
在MS.Internal.Documents.Application.DocumentManager。&lt;&gt; c__DisplayClass6.b__5(IDocumentController控制器,文档主题)
在MS.Internal.Documents.Application.ChainOfResponsiblity 2.Dispatch(Action action, S subject)
at MS.Internal.Documents.Application.DocumentManager.<>c__DisplayClass6.<OrderByLeastDependent>b__4(Document member)
at MS.Internal.Documents.Application.ChainOfDependencies
1.OrderByLeastDependent(T成员,行动)
在MS.Internal.Documents.Application.DocumentManager.OrderByLeastDependent(DispatchDelegate操作,文档文档)
在MS.Internal.Documents.Application.DocumentManager.Open(文档文档)
在MS.Internal.AppModel.ApplicationProxyInternal.InitContainer()
在MS.Internal.AppModel.ApplicationProxyInternal.Run(InitData initData)
答案 0 :(得分:3)
我想问题是字节没有完全写入响应。 尝试以下操作,希望它能够正常工作。
HttpContext context = HttpContext.Current;
context.Response.Clear();
context.Response.ContentType = "application/vnd.ms-xpsdocument";
context.Response.AppendHeader("Content-Disposition", "attachment; filename=document.xps");
context.Response.End();