0

I have the method below that fills in data into a pdf:

    public Stream FillDataIntoPDF(){

            var pdfTemplate = _fileService.GetFileInfo(pdfFilePath);

            Stream outStream = new MemoryStream();

            using Stream inputStream = pdfTemplate.CreateReadStream();
            PdfReader? pdfReader = new PdfReader(inputStream);
            PdfStamper? pdfStamper = new PdfStamper(pdfReader, outStream);
            AcroFields fields = pdfStamper.AcroFields;

    foreach (var f in fields.Fields.Keys)
            {
                form.SetField(f.ToString(), "testValue");
            }

        pdfStamper.Close();
            pdfReader.Close();

            return outStream;
    }

The above works fine.

Then I have the method below that calls the method FillDataIntoPDF, creates a pdf and then converts it to a byte Array.

    public byte[] CreatePDF()
    {
        using MemoryStream outputStream = new MemoryStream();
        using Stream pdfStreamResult = FillDataIntoPDF();

        pdfStreamResult.Position = 0;
        pdfStreamResult.CopyTo(outputStream);
    var pdfArray = outputStream.ToArray();

    // I cannot find any fields
        PdfReader pdfReader = new PdfReader(pdfArray);
        PdfStamper stamper = new PdfStamper(pdfReader, outputStream);
        AcroFields fields = stamper.AcroFields;

        foreach (var f in fields.Fields.Keys)
        {
            fields.GetField(f!.ToString());
        }

        return pdfArray;
    }

I need to read from the PDFArray for testing purposes. When I pass the byte array into the PDFReader, the Acrofield/fields count is 0 but this is the same byte array that was filled in using the FillDataIntoPDF method.

Any idea on how to read PDF Field values from a byte array?

avdeveloper
  • 449
  • 6
  • 30
  • 1
    Hhmmm, at first glance a `PdfReader` should find the fields without problem. Can you share a PDF for which you get that problem? (What is a bit weird is your using a `PdfStamper` in `CreatePDF()` without use and it writing to a stream that already contains a PDF...) – mkl Jan 24 '22 at 15:54

1 Answers1

0

Do not forget to set the MemoryStream position within the current stream to the first position after CopyTo.

public byte[] CreatePDF()
{
    using MemoryStream outputStream = new MemoryStream();
    using Stream pdfStreamResult = FillDataIntoPDF();

    pdfStreamResult.Position = 0;
    pdfStreamResult.CopyTo(outputStream);

    // Set the position to the beginning of the stream.
    outputStream.Seek(0, SeekOrigin.Begin);


    var pdfArray = outputStream.ToArray();

    // I cannot find any fields
    PdfReader pdfReader = new PdfReader(pdfArray);
    PdfStamper stamper = new PdfStamper(pdfReader, outputStream);
    AcroFields fields = stamper.AcroFields;

    foreach (var f in fields.Fields.Keys)
    {
        fields.GetField(f!.ToString());
    }

    return pdfArray;
}
e.ayoubi
  • 1
  • 2