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

Zha*_*JIN 2 c# memory pdf itext

如何使用itext7在内存流中创建PDF,而不是物理文件?我不知道如何在最新版本中进行操作,有帮助吗?

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

string filePath = "./abc.pdf";

MemoryStream pdfSM = new ByteArrayOutputStream();

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

doc.close();
Run Code Online (Sandbox Code Playgroud)

完整的测试代码如下,供您参考,它在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();

    }
Run Code Online (Sandbox Code Playgroud)

Fre*_*red 6

这对我有用。

    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();
    }
Run Code Online (Sandbox Code Playgroud)

  • 我在 .NET Standard 2.0 中也遇到了 ObjectDisposeException。添加此行可以解决问题:writer.SetCloseStream(false); (3认同)
  • 嗨,弗雷德,这是不对的。当您关闭文档时,PdfWriter 中的 MemoryStream 也会关闭,因为它是 IDisposable,并且在调用 document.Close() 时立即调用 stream.dispose() 。尝试访问流时引发异常:System.ObjectDisposeException:“无法访问已关闭的流。” (2认同)