Hola,
Puedes traer el archivo de la DB y guardarlo en una ruta temporal
Código Delphi
[-]
function DirectorioTemporal : string;
var
Buffer : array [0 .. MAX_PATH] of Char;
begin
if GetTempPath(Length(Buffer), Buffer) > 0 then
Result := IncludeTrailingBackslash(Buffer);
end;
Luego cargarlo en un visor dentro de tu app. y al final borrar el archivo temporal.
Para el visor puedes importar el visor de PDF de Acrobat, aunque necesitarás que los clientes tengan PDF instalado. Si usas este visor no evitarás que puedan guardar el archivo. al menos yo no se como modificar esas opciones.
usar ese visor es simple.
aquí un ejemplo y la documentación del ActiveX
está aquí
Entiendo que no quieres descargarlo, pero como la posible solución la planteo con el visor de Acrobat, con este no se como hacer la carga desde un stream.