Jonathan: Shrink is 'resume-able' meaning that the work done isn't lost if you stop it and then resume running it again later. You might have to shrink in low usage times over multiple days and stop the process when activity increases again to get it shrunk down completely.
Kevin: If possible, create a partition. Move all the data you wish to purge into the partition. Drop the partition. This is significantly faster than DELETE (logging all the deleted rows) and TRUNCATE (logging all the truncated pages), since the drop partition action consumes only the one transaction log action.