Backend/Java

PDFJS 사용해보기

elevne 2023. 1. 10. 23:11

프로젝트를 진행하며 PDF 파일을 화면에 일부 띄우는 작업을 진행해야 했다. 라이브러리를 사용하지 않고 띄우는 것도 가능하지만 조금의 커스터마이징을 하기 위해서 pdfjs 를 사용해보았다. 우선 아래 링크에서 필요한 파일들을 다운로드 받아준다.

 

링크: https://mozilla.github.io/pdf.js/

 

PDF.js

PDF.js A general-purpose, web standards-based platform for parsing and rendering PDFs. Download Demo GitHub Project

mozilla.github.io

 

 

 

우선 다운받은 폴더를 src 폴더 내에 넣는다. pdfjs 는 다운로드 받은 폴더 내 web 폴더 안에 있는 viewer.html 을 iframe 태그로 가져와서 사용하게 되는 것이다. (해당 viewer.html 에 pdf 를 불러오는 것) 사용 방법은 간단하다. 아래와 같이 viewer.html 의 경로와 pdf 파일이 있는 경로를 iframe 의 src 에 넣어주면 된다.

 

 

 

<iframe src="/pdfjs/web/viewer.html?file=/file/test.pdf" id="viewer"></iframe>

 

 

 

하지만 실제로 사용할 때 iframe 태그 내에 파일의 경로를 직접 적어주는 것보다는 해당 파일의 다운로드 링크를 만들어준 뒤 이를 pdf 파일 경로로 사용하는 것이 더 바람직하다고 한다. 우선 다운로드를 받기 위한 링크를 아래와 같이 컨트롤러에 만들어주었다.

 

 

 

    @GetMapping(path = "/download/{id}")
    public void fileDownload(@PathVariable(name = "id") Integer fileId, HttpServletResponse response) {
        
        // 파일정보불러오기
        FileInfo fileInfo = fileService.getFileInfo(fileId);
        String fileName = fileInfo.getFileName(); // 파일이름
        String tempfileName = fileInfo.getSaveFileName(); // 파일경로
        StringBuilder sb = new StringBuilder("c:/tmp/");
        sb.append(tempfileName);
        String saveFileName = sb.toString();
        
        String contentType = fileInfo.getContentType();
        File file = new File(saveFileName);
        long fileLength = file.length();
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
        response.setHeader("Content-Transfer-Encoding", "binary"); 
        response.setHeader("Content-Type", contentType);
        response.setHeader("Content-Length", "" + fileLength);
        response.setHeader("Pragma", "no-cache;");
        response.setHeader("Expires", "-1;");
        
        try (FileInputStream fis = new FileInputStream(saveFileName); OutputStream out = response.getOutputStream();) {  
            int readCount = 0;
            byte[] buffer = new byte[1024];
            while ((readCount = fis.read(buffer)) != -1) {
                out.write(buffer, 0, readCount);
            }
        } catch (Exception ex) {
            throw new RuntimeException("file Load Error");
        }
    }

 

 

 

파일 다운로드 관련 코드는 아래 링크에서 가져왔다.

 

링크: https://takeknowledge.tistory.com/62

 

스프링에서 파일다운로드 구현하는 방법

일단 서버에 파일은 있고 데이터베이스에 파일 정보는 저장되어 있다고 가정한다 ( 참고 : 스프링에서 컨트롤러로 넘어온 파일 저장하는 방법 - https://takeknowledge.tistory.com/61 ) 사실 업로드를 잘

takeknowledge.tistory.com

 

 

 

 

그럼 이제 이를 활용하여 다시 iframe 태그를 작성해보자면 아래와 같은 것이다.

 

 

 

<iframe src="/pdfjs/web/viewer.html?file=/download/id1" id="viewer"></iframe>

 

 

 

이처럼 몇 가지 간단한 세팅만으로 pdfjs 를 사용해볼 수 있다.