为什么我的 PDF 在 iText 编辑后不可读?

Why my PDF is not readable after edited by iText?

我的 PDF 在尝试编辑文本后无法阅读。 如何让它发挥作用?

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

基本上 objective 是编辑 PDF 文档并替换特定文本。

输入已经在二进制流中 (byte[ ])

我为 PDF 编辑库开发了 C# 环境和 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();
    }
}

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

只有在关闭压模时,才会写入 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" 中所有字符的字形。这些假设都不会自动成立。