java下載PDF文件

在實(shí)際應(yīng)用中有這么一個(gè)場景,用戶希望在頁面上有一個(gè)下載按鈕,點(diǎn)擊按鈕時(shí)把當(dāng)前頁的內(nèi)容生產(chǎn)一個(gè)PDF文件下載下來。

這個(gè)需求有兩種表現(xiàn)形式,一種是當(dāng)用戶點(diǎn)擊按鈕時(shí)直接在瀏覽器中彈出保存框下載PDF文件,另一種是返回PDF的視圖,在瀏覽器中預(yù)覽PDF文件的內(nèi)容,然后再下載。

這里分別介紹兩種實(shí)現(xiàn)方式:

一、直接下載PDF文件

本質(zhì)上來說,把PDF文件讀取到inputStream中,繼而放入返回的的實(shí)體中。
返回的ResponseEntity中,注意指定Content-Type的內(nèi)容為application/pdf,
且Content-Disposition的內(nèi)容為attachment; filename="helloWorld.pdf"

@RequestMapping(value = "/pdfDownload", method = GET)
    public ResponseEntity download() throws IOException {
        File file = new File("HelloWorld.pdf");
        InputStream in = new FileInputStream(file);
        final HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Type", "application/pdf");
        headers.add("Content-Disposition", "attachment; filename=" + file.getName() );
        return new ResponseEntity<>(IOUtils.toByteArray(in), headers, HttpStatus.OK);
    }

該方法在瀏覽器中直接訪問localhost:8080/pdfDownload就回彈出一個(gè)文件保存框,選擇保存的本地路徑即可下載,或者有的效果是直接在瀏覽器中下載了PDF文件,這是因?yàn)樗褂玫臑g覽器本身的下載設(shè)置,可以根據(jù)個(gè)人喜好來設(shè)置究竟彈出還是不彈出保存框。

二、瀏覽器預(yù)覽PDF文件,再下載

如果使用的不是RestController,就可以直接返回一個(gè)String字符串,內(nèi)容為PDF文件的視圖名稱,這里定義為helloWorldPDF,該視圖名在views.properties中配置

@RequestMapping(value = "/pdfDownload2", method = GET)
    public String download2(HttpServletRequest request) throws IOException {
        return "helloWorldPDF";
    }

resource資源文件夾中的views.properties文件的內(nèi)容為:

helloWorldPDF.(class)=com.test.report.PDFView

這里的com.test.report.PDFView指的是定義的PDF視圖的內(nèi)容。
我們使用了itextpdf的jar包來生成PDF文件的內(nèi)容。

compile group: 'com.itextpdf', name: 'itextpdf', version: '5.5.6'
public class PDFView extends AbstractView {
    public PDFView() {
        setContentType("application/pdf");
    }

    @Override
    protected boolean generatesDownloadContent() {
        return true;
    }

    @Override
    protected final void renderMergedOutputModel(Map<String, Object> model,
                                                 HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        ByteArrayOutputStream baos = createTemporaryOutputStream();
        Document document = new Document(PageSize.A4);
        PdfWriter writer = PdfWriter.getInstance(document, baos);
        writer.setViewerPreferences(PdfWriter.ALLOW_PRINTING | PdfWriter.PageLayoutSinglePage);
        document.open();
        Paragraph header = new Paragraph(new Chunk("hello world"));
        document.add(header);
        document.close();
        writeToResponse(response, baos);
    }
}

以上就生成了我們需要的PDF文件的內(nèi)容,并放進(jìn)ByteArrayOutputStream中,調(diào)用writeToResponse方法把字節(jié)流傳進(jìn)response中。

因?yàn)槭褂玫氖荢pringBootApplication,所以需要加的一些配置是在 Application 的包含main方法的class中進(jìn)行的

@Bean
    public ResourceBundleViewResolver viewResolver() {
        ResourceBundleViewResolver resolver = new ResourceBundleViewResolver();
        resolver.setOrder(1);
        resolver.setBasename("views");
        return resolver;
    }

如此一來就可以直接在瀏覽器中訪問localhost:8080/pdfDownload2看到PDF文件的預(yù)覽頁面,在頁面中可以進(jìn)行下載,打印等操作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,432評論 4 61
  • 那位媽媽帶著孩子C迎面走過來了。孩子頭上帶著一個(gè)臉譜面具,還問東東你想要嗎?那位媽媽也說C書包里還有呢??吹竭@樣的...
    劉月紅閱讀 201評論 0 1
  • 1.意境聯(lián) 陟巚望原,思?jí)言骑w,轔轔車馬夕陽道; 指天問劍,氣雄風(fēng)唱,獵獵旌旗故國游。 2.機(jī)巧聯(lián) 春秋交替,醉一...
    水影晃樹閱讀 497評論 1 7
  • 最近很多小伙伴問小編,手機(jī)狀態(tài)欄多了一個(gè)“HD”,這個(gè)到底是個(gè)什么鬼,怎么取消呢? 現(xiàn)在小編就給大家科普一下,手機(jī)...
    科技家園閱讀 10,766評論 0 0
  • 描寫笑的經(jīng)典文字,紅樓夢里就有一段,節(jié)選在初中的課本里。右邊那頁最下面有一段點(diǎn)評,大意是常人寫這個(gè)可能就一句哄堂大...
    酒溪閱讀 509評論 8 5

友情鏈接更多精彩內(nèi)容