在新浏览器选项卡中打开响应实体 PDF

2022-09-03 05:30:05

我遇到了一个有用的PDF生成代码,用于在Spring MVC应用程序中向客户端显示文件(使用Spring MVC返回生成的PDF):

@RequestMapping(value = "/form/pdf", produces = "application/pdf")
public ResponseEntity<byte[]> showPdf(DomainModel domain, ModelMap model) {
    createPdf(domain, model);

    Path path = Paths.get(PATH_FILE);
    byte[] pdfContents = null;
    try {
        pdfContents = Files.readAllBytes(path);
    } catch (IOException e) {
        e.printStackTrace();
    }

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.parseMediaType("application/pdf"));
    String filename = NAME_PDF;
    headers.setContentDispositionFormData(filename, filename);
    headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
    ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(
            pdfContents, headers, HttpStatus.OK);
    return response;
}

我添加了一个声明,该方法返回PDF文件(Spring 3.0 Java REST返回PDF文档):。produces = "application/pdf"

我的问题是,当上面的代码被执行时,它会立即要求客户端保存PDF文件。我希望首先在浏览器中查看PDF文件,以便客户端可以决定是否保存它。

我发现如何让PDF内容(从Spring MVC控制器方法提供)出现在新窗口中,建议添加Spring表单标签。我测试了它,正如预期的那样,它显示了一个新选项卡,但保存提示再次出现。target="_blank"

一个是“我无法通过Java在浏览器中打开.pdf的方法添加,但我没有用于提供我的PDF文件。httpServletResponse.setHeader("Content-Disposition", "inline");HttpServletRequest

鉴于我的代码/情况,如何在新选项卡中打开PDF文件?


答案 1

尝试

httpServletResponse.setHeader("Content-Disposition", "inline");

但按如下方式使用响应实体。

HttpHeaders headers = new HttpHeaders();
headers.add("content-disposition", "attachment; filename=" + fileName)
ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(
            pdfContents, headers, HttpStatus.OK);

它应该工作

不确定这一点,但似乎你正在使用不好的集合内容处置FormData,试试>

headers.setContentDispositionFormData("attachment", fileName);

让我知道这是否有效

更新

此行为取决于您尝试提供的浏览器和文件。使用内联,浏览器将尝试在浏览器中打开文件。

headers.setContentDispositionFormData("inline", fileName);

headers.add("content-disposition", "inline;filename=" + fileName)

阅读本文以了解内联和附件之间的区别


答案 2

春靴 2

使用此代码在浏览器中显示 pdf。(目录资源中的 PDF -> 类路径)使用响应实体<>

    @GetMapping(value = "/showPDF")
public ResponseEntity<?> exportarPDF( ){        
    
    InputStreamResource file = new InputStreamResource(service.exportPDF());
    
    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, "inline;attachment; filename=ayuda.pdf")
            .contentType(MediaType.APPLICATION_PDF)
            .body(file);            
}




@Service
public class AyudaServiceImpl implements AyudaService {
    private static final Logger LOGGER = LoggerFactory.getLogger(LoadPDF.class);
    
    LoadPDF  pdf = new LoadPDF();
    
    public InputStream exportPDF() {    
        LOGGER.info("Inicia metodo de negocio :: getPDF");                  
        return pdf.getPDF();
    }
}

---酸酶

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;


public class LoadPDF {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(LoadPDF.class);
    public  InputStream getPDF(){        
               
        try {
            File file = ResourceUtils.getFile("classpath:ayuda.pdf");
            LOGGER.debug("Ruta del archivo pdf: [" + file + "]");
            InputStream in = new FileInputStream(file);
            LOGGER.info("Encontro el archivo PDF");
            return in;
        } catch (IOException e) {
            LOGGER.error("No encontro el archivo PDF",e.getMessage());
            throw new AyudaException("No encontro el archivo PDF", e ); 
        }
    }
}

推荐