Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用iTextSharp创建PDF而不保存文件_C#_Itext - Fatal编程技术网

C# 使用iTextSharp创建PDF而不保存文件

C# 使用iTextSharp创建PDF而不保存文件,c#,itext,C#,Itext,我正在使用Visual Studio 2013、c#Windows应用程序、iTextSharp: 我可以很容易地创建/保存pdf文件并写入其中,但是有没有一种方法可以只使用pdf文件并写入而不首先保存它?我不想每次有人运行报表时都创建一个临时pdf文件。提前谢谢 Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10,10,42,35); PdfWriter wri = PdfWriter.GetInstance(doc

我正在使用Visual Studio 2013、c#Windows应用程序、iTextSharp:

我可以很容易地创建/保存pdf文件并写入其中,但是有没有一种方法可以只使用pdf文件并写入而不首先保存它?我不想每次有人运行报表时都创建一个临时pdf文件。提前谢谢

Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10,10,42,35);

PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream("Test.pdf", 
FileMode.Create));

doc.Open();

\\\\ Then I do a bunch of stuff, then do a close


doc.Close();

您可以使用MemoryMappedFile并对其进行写入,而且它不是基于磁盘的

using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("INMEMORYPDF.pdf", 1000000))
{
    PDFPageMargins margins = new PDFPageMargins(10, 10, 10, 10);
    var document = new Document((_pageWidth > 540) ? PageSize.A4.Rotate() : PageSize.A4, margins.Left, margins.Right, margins.Top, margins.Bottom);
    using (MemoryMappedViewStream stream = mmf.CreateViewStream())
    {                       

        PdfWriter.GetInstance(document, stream);
        document.Open();
        //MODIFY DOCUMENT
        document.Close();                    
    }
    byte[] content;
    using (MemoryMappedViewStream stream = mmf.CreateViewStream())
    {
        BinaryReader rdr = new BinaryReader(stream);
        content = new byte[mmf.CreateViewStream().Length];
        rdr.Read(content, 0, (int)mmf.CreateViewStream().Length);
    }
    return content;            
}

您可以使用MemoryMappedFile并对其进行写入,而且它不是基于磁盘的

using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("INMEMORYPDF.pdf", 1000000))
{
    PDFPageMargins margins = new PDFPageMargins(10, 10, 10, 10);
    var document = new Document((_pageWidth > 540) ? PageSize.A4.Rotate() : PageSize.A4, margins.Left, margins.Right, margins.Top, margins.Bottom);
    using (MemoryMappedViewStream stream = mmf.CreateViewStream())
    {                       

        PdfWriter.GetInstance(document, stream);
        document.Open();
        //MODIFY DOCUMENT
        document.Close();                    
    }
    byte[] content;
    using (MemoryMappedViewStream stream = mmf.CreateViewStream())
    {
        BinaryReader rdr = new BinaryReader(stream);
        content = new byte[mmf.CreateViewStream().Length];
        rdr.Read(content, 0, (int)mmf.CreateViewStream().Length);
    }
    return content;            
}

在不保存的情况下对其进行写入?我只是猜测,可能是重复的,但您是否正在创建web应用程序?您是否希望提供pdf作为下载,而不将其保存到磁盘?不,不是web应用程序,windows/桌面应用程序写入,而不保存?我只是猜测,可能是重复的,但您正在创建web应用程序吗?您想提供pdf作为下载,而不将其保存到磁盘上吗?不,不是web应用程序,windows/桌面应用程序。如果可以使用MemoryStream,为什么要使用mmf?嗯,对于一个应用程序,mmf可以通过传递句柄或指针在进程之间共享。要使用mmf,必须指定最大大小。选择此大小太小,当PDF需要更多内存时将失败。选择此大小太高,当进程中的地址空间无法提供足够的连续内存时,它将失败。仍然没有有效的原因这是无效的。我回答了OP的问题,这段代码可以在需要大量内存分配的应用程序中使用,这些内存分配类似于文件。该文件可用于进程间通信。@NineBerry-谢谢您的评论。你说得对。CreateNew的实现方式需要一个预先大小要求。如果可以只使用MemoryStream,为什么要使用mmf?嗯,对于其中一个,mmf可以通过传递句柄或指针在进程之间共享。要使用mmf,必须指定最大大小。选择此大小太小,当PDF需要更多内存时将失败。选择此大小太高,当进程中的地址空间无法提供足够的连续内存时,它将失败。仍然没有有效的原因这是无效的。我回答了OP的问题,这段代码可以在需要大量内存分配的应用程序中使用,这些内存分配类似于文件。该文件可用于进程间通信。@NineBerry-谢谢您的评论。你说得对。CreateNew的实现方式需要一个预先的大小要求。