Exemple #1
0
        void CreateEncrypt(PdfElement elem)
        {
            var cf = elem.Get <PdfElement>("CF");

            if (cf != null)
            {
                var stdCf = cf.Get <PdfElement>("StdCF");
                if (stdCf != null)
                {
                }
            }
            var pValue = elem.Get <PdfInteger>("P").Value;
            var vValue = elem.Get <PdfInteger>("V").Value;
            var rValue = elem.Get <PdfInteger>("R").Value;
            var oValue = elem.Get <PdfString>("O").ToISOBytes();
            var uValue = elem.Get <PdfString>("U").ToISOBytes();
            var filter = elem.Get <PdfName>("Filter")?.Name;

            EncryptAlg cryptoMode = EncryptAlg.STANDARD_ENCRYPTION_128;

            switch (rValue)
            {
            case 4:
                if (vValue != 4)
                {
                    throw new PdfException($"Invalid encrypt. V={vValue}, P={vValue}");
                }
                var cfObj    = elem.Get <PdfDictionary>("CF");
                var stdCfObj = cfObj.Get <PdfDictionary>("StdCF");
                if (stdCfObj != null)
                {
                    if (stdCfObj.Get <PdfName>("CFM")?.Name == "V2")
                    {
                        cryptoMode = EncryptAlg.STANDARD_ENCRYPTION_128;
                    }
                }
                break;

            default:
                throw new NotImplementedException($"Decrypt value {rValue}");
            }

            _decryptor = new PdfEncryption();
            _decryptor.SetCryptoMode(cryptoMode, 0);

            if (filter == "Standard")
            {
                if (rValue != 5)
                {
                    _decryptor.SetupByOwnerPassword(_documentId, uValue, oValue, pValue);
                    Int32 checkLen = (rValue == 3 || rValue == 4) ? 16 : 32;
                    if (!EqualsArray(uValue, _decryptor.UserKey, checkLen))
                    {
                        _decryptor.SetupByUserPassword(_documentId, oValue, pValue);
                    }
                }
            }
        }
Exemple #2
0
        void ParseObjStream(PdfElement elem)
        {
            PdfStream stream = elem.Get <PdfStream>("_stream");
            var       ms     = new MemoryStream(stream.Bytes);

            using (var br = new BinaryReader(ms))
            {
                PdfReader rdr = PdfReader.Create(br);
                foreach (var obj in rdr.ReadObjStream())
                {
                    var name = $"{obj.Item1} 0";
                    if (obj.Item2 is PdfDictionary objDict)
                    {
                        AddObject(name, objDict);
                    }
                }
            }
        }