如何在没有使用C#的库的情况下修改PDF并将其流回ASP.NET中的客户端?

时间:2009-11-20 17:05:22

标签: c# pdf stream asp.net-3.5

我遇到了一个问题,即我已损坏PDF并且不确定是否有正确的解决方案。我看过几篇关于人们试图做基本流或试图用第三方库修改文件的帖子。这就是我的情况不同......

我已经准备好了所有的网页,以便让我回流PDF,直到我尝试使用C#进行修改,它才能正常工作。

  1. 我手动修改了文本编辑器中的PDF以删除<>条目并在此之后测试PDF是否正常运行。

  2. 然后我以编程方式从数据库中以字节[]的形式流式传输PDF,将其转换为字符串,使用RegEx查找并删除我尝试手动删除的相同内容。

  3. 问题!当我尝试将修改后的PDF字符串内容转换回byte []以进行流式传输时,PDF编码似乎不再正确。什么是正确的编码?

  4. 有谁知道做这样事情的最佳方式?我只是想让我的解决方案尽可能轻松,因为我们的网站面向PDF文档访问,因此除非没有其他选项可用,否则不太可能使用繁重的API或复杂的API。此外,因为这种情况实际上只有当我们的用户在iframe中查看“预览”文件时,我才能永久修改PDF。

    提前感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

你似乎在发现......

PDF格式并非无足轻重!

因此 补丁 一些“文本”字节, in-situ (即保持大小和结构不变),“混乱”更多,与PDF文件通常最终打破它们。肯定的正则表达似乎是这项工作的一个钝器。

PDF文件需要被解析并被视为分层集合对象(然后是一些......),这就是为什么我们需要封装有关格式知识的库。

如果您需要说服力,可以仔细阅读Adobe网站上免费提供的PDF Format (version 1.7)现在的ISO标准规范。顺便说一下,这750个页面涵盖了最新版本,虽然有很多叠加,但之前的版本引入了另一层细节来应对......

修改
这说,在重新阅读这个问题时,以及Lucero的评论,指示的变化似乎很小/足够安全,以至于“剪切和折叠”方法可能有效。
请注意,这种类型的方法可能会导致问题,随着时间的推移(当遇到的格式是不同的,更旧的或更新的!版本时,或者当文件内容以某种方式导致不同的结构暴露,或......)或还有一些特定用途(例如,它可能会阻止用户使用PDF文档的某些功能,如表单或安全性)。也许妥协是要充分了解手头的格式,并确认这些变化确实是随意的。

另外...... 虽然PDF格式是一个相对复杂的事情,处理它的图书馆不一定很重,而且它们通常很容易使用

简而言之,你需要权衡两种方法的利弊,并相应地选择;-)(对于“非答案”来说,这是怎么回事。)

答案 1 :(得分:2)

尝试使用以下BinaryEncoding类作为编码。它基本上将所有字节转换为字符(并返回),这样只有ASCII数据才能正确处理为字符串,但只要不使用任何UNICODE字符,就可以保持其余数据不变,不会丢失任何字符。 0x00FF。所以对于你的往返来说它应该可以正常工作。

public class BinaryEncoding: Encoding {
    private static readonly BinaryEncoding @default = new BinaryEncoding();

    public static new BinaryEncoding Default {
        get {
            return @default;
        }
    }

    public override int GetByteCount(char[] chars, int index, int count) {
        if (chars == null) {
            throw new ArgumentNullException("chars");
        }
        return count;
    }

    public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) {
        if (chars == null) {
            throw new ArgumentNullException("chars");
        }
        if (bytes == null) {
            throw new ArgumentNullException("bytes");
        }
        if (charCount < 0) {
            throw new ArgumentOutOfRangeException("charCount");
        }
        unchecked {
            for (int i = 0; i < charCount; i++) {
                bytes[byteIndex+i] = (byte)chars[charIndex+i];
            }
        }
        return charCount;
    }

    public override int GetCharCount(byte[] bytes, int index, int count) {
        if (bytes == null) {
            throw new ArgumentNullException("bytes");
        }
        return count;
    }

    public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) {
        if (bytes == null) {
            throw new ArgumentNullException("bytes");
        }
        if (chars == null) {
            throw new ArgumentNullException("chars");
        }
        if (byteCount < 0) {
            throw new ArgumentOutOfRangeException("byteCount");
        }
        unchecked {
            for (int i = 0; i < byteCount; i++) {
                chars[charIndex+i] = (char)bytes[byteIndex+i];
            }
        }
        return byteCount;
    }

    public override int GetMaxByteCount(int charCount) {
        return charCount;
    }

    public override int GetMaxCharCount(int byteCount) {
        return byteCount;
    }
}

答案 2 :(得分:1)

了解IText。有一个原因可以解释像apache commons库这样的东西。