Which PDF? What exactly does it say?
How far apart are your reflectance sensors and how thick is your line? One thing I suggest you try if you haven't already is printing out the line position/error as you slide your robot across the line. Make sure that the numbers you see are constantly (and, ideally, smoothly) increasing as you slide the bot. If there are local minima/maxima in your error function (as could happen if your sensors are too far apart relative to your line width), PID will probably not work well.
Here are a few tips/suggestions:
1) Don't start your PID tuning with your motors at full speed. It's much easier to get a line-follower working at low speeds, and doing so can at least get you in the right ball park for your PID constants; from there you can gradually increase your speed and adjust the constants as necessary.
2) The P term alone should be enough to let you follow a reasonably straight line at slow speeds (if your bot seems unstable in such situations, you might have a sign error), but it is generally not sufficient for a good, fast line follower on a real course. To get decent results, I expect you will need to add a differential term, D.
The logic you used to pick your proportional constant, Kp, is sound, so I suggest you go with that and start testing differential constants, Kd. Note that Kd is being multiplied by the difference in successive errors, which will generally be much smaller than the error itself, so Kd usually needs to be much bigger than Kp for it to have a comparable effect on the motor speed differential. I suggest you start with a Kd constant that is 10 to 20 times bigger than Kp. If the Kd term doesn't make things better, check to make sure your signs are right.
If you want to be able to drive quickly around sharp turns, you are going to need a large P term so that your bot reacts sufficiently as it starts to drive off the course, but this in turn can cause a severe overshoot and subsequent oscillations without an appropriate D term. The D term takes history into account and contributes a response based on what is happening to the error term over time. If the error is getting smaller, it acts to weaken the response so you don't overshoot, and the faster it is shrinking, the more it weakens the response. On the other end of the spectrum, if the error is getting bigger despite your proportional response, the D term makes the response even stronger, helping to keep you on the line as even as it's sharply arcing away.
3) Working with floats is very slow on an 8-bit MCU like the AVR, and it's not really necessary for the kind of math you are doing. I suggest you consider working with integers instead. For example, if you want a proportional constant Kp of 1.7, you can do:
response = error * 17 / 10; // instead of response = error *1.7;