tags:

views:

931

answers:

1

I hwas trying to generate a multi page XPS document from a web application and trying to stream that ona button click.

public class 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();
    }
}

}

This wroks fine on the development environment.But getting this error when deployed on a different machine.(IIS6).

Startup URI: C:\Documents and Settings\050583b.syn\Desktop\document.xps Application Identity:

System.IO.FileFormatException: File contains corrupted data. at MS.Internal.IO.Zip.ZipIOEndOfCentralDirectoryBlock.FindPosition(Stream archiveStream) at MS.Internal.IO.Zip.ZipIOEndOfCentralDirectoryBlock.SeekableLoad(ZipIOBlockManager blockManager) at MS.Internal.IO.Zip.ZipIOBlockManager.LoadEndOfCentralDirectoryBlock() at MS.Internal.IO.Zip.ZipArchive..ctor(Stream archiveStream, FileMode mode, FileAccess access, Boolean streaming, Boolean ownStream) at MS.Internal.IO.Zip.ZipArchive.OpenOnStream(Stream stream, FileMode mode, FileAccess access, Boolean streaming) at System.IO.Packaging.ZipPackage..ctor(Stream s, FileMode mode, FileAccess access, Boolean streaming) at System.IO.Packaging.Package.Open(Stream stream, FileMode packageMode, FileAccess packageAccess, Boolean streaming) at System.IO.Packaging.Package.Open(Stream stream) at MS.Internal.Documents.Application.TransactionalPackage..ctor(Stream original) at MS.Internal.Documents.Application.PackageController.MS.Internal.Documents.Application.IDocumentController.Open(Document document) at MS.Internal.Documents.Application.DocumentManager.DispatchOpen(IDocumentController controller, Document document) at MS.Internal.Documents.Application.DocumentManager.<>c__DisplayClass6.b__5(IDocumentController controller, Document subject) at MS.Internal.Documents.Application.ChainOfResponsiblity2.Dispatch(Action action, S subject) at MS.Internal.Documents.Application.DocumentManager.<>c__DisplayClass6.<OrderByLeastDependent>b__4(Document member) at MS.Internal.Documents.Application.ChainOfDependencies1.OrderByLeastDependent(T member, Action action) at MS.Internal.Documents.Application.DocumentManager.OrderByLeastDependent(DispatchDelegate action, Document document) at MS.Internal.Documents.Application.DocumentManager.Open(Document document) at MS.Internal.AppModel.ApplicationProxyInternal.InitContainer() at MS.Internal.AppModel.ApplicationProxyInternal.Run(InitData initData)


+1  A: 

i guess the problem is the with the bytes not completely getting written into response. try the following hopefully it should work..

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();

Thanks.This change fixed the problem.