Pujara hit his sixth century in only his 16th Test as India piled up 2-284 in their second innings, an overall lead of 320, against a depleted South African bowling attack.
The foundation was laid by Pujara and Murali Vijay (39) during a watchful second wicket stand of 70.
Pujara (135 not out) and first innings century-maker Kohli (77 not out) shared an unbeaten third wicket partnership of 191 on a pitch difficult for batsmen.
As the South African bowlers wilted the batsmen were able to score freely, adding 175 in 38 overs between tea and the close.
South Africa were without Morne Morkel for most of the innings after the tall fast bowler suffered a strained right ankle while fielding. The injury is likely to keep Morkel out of the second and final Test starting in Durban on December 26.
In Morkel's absence, the batsmen were able to blunt the threat of Dale Steyn and Vernon Philander.
South African captain Graeme Smith was forced to juggle an attack in which spin bowlers Imran Tahir and JP Duminy were ineffective, even turning to wicketkeeper AB de Villiers for one over before tea.
Pujara was cautious at the start of his innings, taking 127 balls to reach his fifty but he then blossomed, needing only another 41 deliveries to reach his century. By the close he had faced 221 balls and hit 18 boundaries.
Kohli, who made 119 in the first innings, was content to play a secondary role and his 77 was scored off 132 balls with eight fours.
South Africa's only successes came from Philander and Jacques Kallis, who dismissed Shikhar Dhawan and Vijay respectively.
Philander claimed his 100th Test wicket in his 19th Test when he had Dhawan caught at second slip for 15. He reached the 100 wicket mark faster than any other South African, achieving the feat in one Test fewer than teammate Dale Steyn.
Earlier, Zaheer Khan and Ishant Sharma finished with four wickets apiece as South Africa, resuming at 6-213, were bowled out for 244, giving India a first innings lead of 36.
Philander made 59.