As the error message says, you can't use :new or :old in a table-level trigger. You need a row-level trigger. So you'd need to add FOR EACH ROW to your declaration
create or replace trigger t1
before update of price on book
for each row
declare
vdif number;
begin
vdif:=:new.price-:old.price;
dbms_output.put_line('Price Diff is '||vdif);
end;
Of course, in reality, you'd never write a trigger that just wrote to the dbms_output buffer (nor would you write production code that depended on anyone seeing anything written to dbms_output). But I assume that you are a student and you're just doing this as part of a homework assignment.