当前位置: 首页 > 知识库问答 >
问题:

iText7在内存中创建PDF而不是物理文件

潘安邦
2023-03-14

如何使用itext7在内存流中创建PDF而不是物理文件?我不知道如何在最新版本中做到这一点,有帮助吗?

我尝试了以下代码,但pdfSM没有正确填充:

string filePath = "./abc.pdf";

MemoryStream pdfSM = new ByteArrayOutputStream();

PdfDocument doc = new PdfDocument(new PdfReader(filePath), new PdfWriter(pdfSM));
.......

doc.close();

完整的测试代码如下所示供您参考,它在通过filePath进入PdfWriter时有效,但不适用于内存流:

    public static readonly String sourceFolder = "../../FormTest/";

    public static readonly String destinationFolder = "../../Output/";

    static void Main(string[] args)
    {

        String srcFilePattern = "I-983";
        String destPattern = "I-129_2014_";

        String src = sourceFolder + srcFilePattern + ".pdf";
        String dest = destinationFolder + destPattern + "_flattened.pdf";
        MemoryStream returnSM = new MemoryStream();

        PdfDocument doc = new PdfDocument(new PdfReader(src), new PdfWriter(returnSM));

        PdfAcroForm form = PdfAcroForm.GetAcroForm(doc, false);

        foreach (PdfFormField field in form.GetFormFields().Values) 
        {
            var fieldName = field.GetFieldName();
            var type = field.GetType();
            if (fieldName != null)
            {
                if (type.Name.Equals("PdfTextFormField"))
                {
                        field.SetValue("T");
                }
            }               
        }
        form.FlattenFields();         
        doc.Close();

    }

共有3个答案

狄玉书
2023-03-14

我也需要同样的东西。让它像这样工作:(我包括了一些提高性能的设置)

 string HtmlString = "<html><head></head><body>some content</body></html>";
 byte[] buffer;
 PdfDocument pdfDoc = null;
 using (MemoryStream memStream = new MemoryStream())
 {
     using(PdfWriter pdfWriter = new PdfWriter(memStream, wp))
     {
        pdfWriter.SetCloseStream(true);
        using (pdfDoc = new PdfDocument(pdfWriter))
        {
           ConverterProperties props = new ConverterProperties();

           pdfDoc.SetDefaultPageSize(PageSize.LETTER);
           pdfDoc.SetCloseWriter(true);
           pdfDoc.SetCloseReader(true);
           pdfDoc.SetFlushUnusedObjects(true);
           HtmlConverter.ConvertToPdf(reader, pdfDoc, props));
           pdfDoc.Close();
        }
     }
     buffer = memStream.ToArray();
 }
 return buffer;
许博易
2023-03-14

iText7、C#控制器

错误:

public ActionResult Report()
{
    //...
    doc1.Close();
    return File(memoryStream1, "application/pdf", "pdf_file_name.pdf");
}

工作:

public ActionResult Report()
{
    //...
    doc1.Close();
    byte[] byte1 = memoryStream1.ToArray();
    return File(byte1, "application/pdf", "pdf_file_name.pdf");
}

我不知道为什么。。。但是,它起作用了!

另一个:链接

唐沈义
2023-03-14

这对我有用。

    public byte[] CreatePdf()
    {
        var stream = new MemoryStream();
        var writer = new PdfWriter(stream);
        var pdf = new PdfDocument(writer);
        var document = new Document(pdf);

        document.Add(new Paragraph("Hello world!"));
        document.Close();

        return stream.ToArray();
    }
 类似资料:
  • 我正在Windows服务器上使用C#处理存储在IIS服务器上的web应用程序。 null

  • 问题内容: 如果我这样做: 然后创建文件,并始终返回“文件存在”。是否可以不创建文件就检查文件是否存在? 编辑: 我忘了提到它处于for循环中。所以这是真实的东西: 问题答案: 实例化a时,您并没有在磁盘上创建任何东西,而只是构建了一个可以调用某些方法的对象,例如。 既好又便宜,不要试图避免这种实例化。 该实例只有两个字段: 这是构造函数: 如您所见,实例只是路径的封装。创建它以便进行调用是继续进

  • 我想检查文件是否存在,并尝试使用以下函数 但是,它似乎不能正常工作,因为不是检查文件的存在而是创建文件!这里有什么问题? 请注意,我被迫使用C 98标准,无法使用include

  • 我正在将一些旧的iTextSharp代码升级到新的iText 7库。我很难确定将2个PDF MemoryStream合并为一个PDF MemoryStream的正确方法,该PDF MemoryStream包含来自两个源PDF MemoryStream的所有页面。这看起来很简单,我认为下面的代码设置正确,但生成的PDF内存流只包含第一个文件。第二个PDF文件从未出现,也从未连接到第一个PDF文件。

  • 一些背景 我正在解决一个问题,我将集合存储在hashmap中,其中键是集合名,即Set1-- 该程序的目的是从用户那里取一个值作为“阈值”,即2,它用于集合之间的最小共性。如果达到或超过阈值,程序建议集合之间合并。 我已经创建了一个组合生成器,它将生成集合名称之间的所有可能组合,以便与未考虑的顺序进行比较,即(Set1,Set2,),(Set1,Set3),(Set2,Set3),(Set1,Se

  • 我试图从多个内存流生成一个PDF文件,但在确定将2个PDF MemoryStream合并为一个PDF MemoryStream的正确方法时遇到了很多困难,该PDF MemoryStream包含来自两个源PDF MemoryStream的所有页面。这看起来很简单,我认为下面的代码设置正确,但生成的PDF内存流并不包含这两个文件的组合。 我很难确定将2个PDF MemoryStream合并为一个PDF