为什么我的PDF在iText编辑后无法读取?

时间:2015-03-09 17:48:13

标签: c# pdf itext

尝试编辑文本后,我的PDF无法读取。 如何使其有效?

我的错误讯息: Adobe Reader无法打开'495049.pdf',因为它不是受支持的文件类型,或者因为文件已损坏(例如,它是作为电子邮件附件发送而未正确解码)

基本上,目标是编辑PDF文档并替换特定文本。

已经以二进制流(byte [])

输入

我在C#环境& amp;用于PDF编辑库的iText。

这是我的代码:

using (PdfReader reader = new PdfReader(doc.FileStream))
{
    PdfDictionary dict = reader.GetPageN(1);
    PdfObject pdfObject = dict.GetDirectObject(PdfName.CONTENTS);
    if (pdfObject.IsStream())
    {
        PRStream stream = (PRStream)pdfObject;
        byte[] data = PdfReader.GetStreamBytes(stream);
        stream.SetData(System.Text.Encoding.ASCII.GetBytes(System.Text.Encoding.ASCII.GetString(data).Replace("[ReplacmentText]", "Hello World")));
    }
    using (MemoryStream ms = new MemoryStream())
    {
        var ignored = new PdfStamper(reader, ms);
        reader.Close();
        return ms.ToArray();
    }
}

1 个答案:

答案 0 :(得分:2)

您的主要错误是在关闭压模之前检索内存流的内容;实际上你完全没有关闭它!

只有在关闭压模时,才会写入PDF的最后部分。因此:

using (MemoryStream ms = new MemoryStream())
{
    var ignored = new PdfStamper(reader, ms);
    ignored.Close();
    reader.Close();
    return ms.ToArray();
}

您的其他问题(可能与您当前的测试文档无关,但一般而言):

stream.SetData(System.Text.Encoding.ASCII.GetBytes(System.Text.Encoding.ASCII.GetString(data).Replace("[ReplacmentText]", "Hello World")));

这非常假设,特别是流内容只包含ASCII字节,占位符" [ReplacementText]" (我假设这是正确的拼写)发生在一个部分和直接内容流中,用于绘制占位符及其替换的字体使用ASCII' ish编码,并且该字体具有所有字符的字形在" Hello World"。这些假设都不会自动成立。