【问题标题】:How to read from byte using ITextSharp PDFReader?如何使用 ITextSharp PDFReader 从字节读取?
【发布时间】:2022-01-24 08:30:52
【问题描述】:

我有下面的方法将数据填充到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;
    }

以上工作正常。

然后我有下面的方法调用方法 FillDataIntoPDF,创建一个 pdf,然后将其转换为一个字节数组。

    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;
    }

出于测试目的,我需要读取 PDFArray。当我将字节数组传递到 PDFReader 时,Acrofield/fields 计数为 0,但这与使用 FillDataIntoPDF 方法填充的字节数组相同。

知道如何从字节数组中读取 PDF 字段值吗?

【问题讨论】:

  • 嗯,乍一看PdfReader 应该可以找到没有问题的字段。你能分享一个你遇到这个问题的PDF吗? (有点奇怪的是您在 CreatePDF() 中使用 PdfStamper 而不使用它,它写入已经包含 PDF 的流......)

标签: c# pdf itext memorystream pdf-reader


【解决方案1】:

不要忘记将当前流中的 MemoryStream 位置设置为 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;
}

【讨论】:

    猜你喜欢
    • 2013-01-13
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多