func eexec(rdr fancy.Reader) []byte { fpos, _ := rdr.Seek(0, 1) b := fancy.ReadAll(rdr) cnt := 0 pos := 0 k := 0 for ; cnt < 256 && k < len(b); k++ { switch b[k] { case 32, 10, 13, 9: case '0': cnt++ default: cnt = 0 pos = k + 1 } } b = b[0:pos] rdr.Seek(fpos+int64(k), 0) if util.IsHex(b[0]) { b, _ = hex.DecodeString(string(b)) } return T1Decrypt(EEXEC_KEY, b)[4:] }
func decodeStream(dic DictionaryT, data []byte) []byte { if f, ok := dic["/Filter"]; ok { filter := ForcedArray(f) var decos [][]byte if d, ok := dic["/DecodeParms"]; ok { decos = ForcedArray(d) } else { decos = make([][]byte, len(filter)) } for ff := range filter { // XXX: if there are multiple filters but only one DecodeParams, // it should be used for all filters deco := Dictionary(decos[ff]) switch string(filter[ff]) { case "/FlateDecode": data = fancy.ReadAndClose(zlib.NewReader(fancy.SliceReader(data))) case "/LZWDecode": early := true if deco != nil { if s, ok := deco["/EarlyChange"]; ok { early = num(s) == 1 } } data = lzw.Decode(data, early) case "/ASCII85Decode": ds := data for len(ds) > 1 && ds[len(ds)-1] < 33 { ds = ds[0 : len(ds)-1] } if len(ds) >= 2 && ds[len(ds)-1] == '>' && ds[len(ds)-2] == '~' { ds = ds[0 : len(ds)-2] } data = fancy.ReadAll(ascii85.NewDecoder(fancy.SliceReader(ds))) case "/ASCIIHexDecode": data, _ = hex.DecodeString(string(data)) default: util.Log("Unsupported filter", string(filter[ff])) data = []byte{} } if s, ok := deco["/Predictor"]; ok { pred := num(s) switch { case pred == 1: // no predictor case pred > 10: colors := numdef(deco["/Colors"], 1) columns := numdef(deco["/Columns"], 1) bitspercomponent := numdef(deco["/BitsPerComponent"], 8) util.Log("applying predictor", pred, colors, columns, bitspercomponent) data = util.ApplyPNGPredictor(pred, colors, columns, bitspercomponent, data) default: util.Log("Unsupported predictor", pred) return nil } } } } return data }