Aqui, não abro um arquivo físico, e sim utilizo o stream de dados para escrever o conteúdo do pdf.
Segue o código do método da DispatchAction do Struts:
public ActionForward geraRelatorio(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {
try {
Map<String, String> parametros = new HashMap<String, String>();
//recuperacao de imagem para o relatorio
//passagem de parametro
parametros.put("caminhoImagem", request.getSession().getServletContext().getRealPath("/images/relatorio/logo.jpg"));
//recuperacao do arquivo compilado do relatorio
InputStream relatorio = getClass().getResourceAsStream("/br/com/relatorio.jasper");
byte[] pdf = ReportUtil.pdfPrint(relatorio, parametros);
response.setContentType("application/pdf");
response.getOutputStream().write(pdf);
} catch (Exception e) {}
//nao pode fazer forward, uma vez que escreveu no response
return null;
}
E segue o exemplo da página contendo simplesmente um iframe: