방명록
- [React.js] 네이버 지도 API, 지도 화면 PDF로 변환! 지도는 없고 빈 화면만 ㅠㅠ2023년 06월 06일 14시 26분 06초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
1. 네이버 지도 API, 지도 화면 PDF로 변환했는데 빈 화면만?!
네이버 지도 API로 렌더링 된 지도가 포함된 페이지를 PDF 파일로 저장하는 기능을 적용했다. 사용한 모듈은 html2pdf와 html2canvas이다. 에러 없이 잘 저장되었으나 생성된 PDF 파일을 열었더니 [그림 1]과 같이 지도 영역에는 빈 화면만 있었다. ㅠㅠ
2. html을 이미지로 변환, 이미지를 PDF로 변환!
html을 이미지로 만들고 그 이미지를 PDF로 만들면 되지 않을까하는 생각이 들었다. 그래서 npm에서 html-to-image와 jspdf를 찾아 설치하여 테스트를 진행했다. 설치한 라이브러리 리스트는 다음과 같다.
"html-to-image": "^1.11.11",
"jspdf": "^2.5.1",html2canvas로 지도 화면을 조작했을 때는 표현되지 않았던 지도가 html-to-image를 이용해 png 화면을 만들었더니 표현이 되었다. [그림 2]와 같이 html이 base64로 인코딩 되었고 이것을 jspdf를 이용해 PDF로 변환하여 저장하였다. 최종 테스트한 코드는 아래와 같다.
const refTotal = useRef(); // 지도가 포함된 화면을 PNG로, PNG를 PDF로 const downloadTest = () => { if (refTotal.current === null) { return; } // html-to-image toPng(refTotal.current, { cacheBust: true }) .then(dataUrl => { const img = new Image(); img.src = dataUrl; console.log('img.src : ', img.src); img.onload = () => { const imgData = dataUrl; // jspdf const pdf = new jsPDF('p', 'mm', 'a4', true); const pdfWidth = pdf.internal.pageSize.getWidth(); console.log('pdfWidth : ', pdfWidth); const pdfHeight = pdf.internal.pageSize.getHeight(); console.log('pdfHeight : ', pdfHeight); const imgWidth = img.width; console.log('imgWidth : ', imgWidth); const imgHeight = img.height; console.log('imgHeight : ', imgHeight); const ratio = Math.min(pdfWidth / imgWidth, pdfHeight / imgHeight); const imgX = (pdfWidth - imgWidth * ratio) / 2; const imgY = 30; pdf.addImage( imgData, 'PNG', imgX, imgY, imgWidth * ratio, imgHeight * ratio, ); pdf.save('map_down_test.pdf'); }; }) .catch(err => { console.log(err); }); };
[그림 3]은 위 코드를 이용해 지도가 잘 표현되어 저장된 PDF 파일이다.
728x90반응형'언어·프레임워크 > React.js' 카테고리의 다른 글
[React.js] 모바일에서도 작동하는 텍스트 클립보드 복사 (0) 2023.09.15 [React.js] Socket.io SSL적용 문제 (0) 2023.08.11 [React.js] 네이버 지도 API Overay의 컬러 데이터 변경시 즉시 반영되지 않는 문제?? (0) 2023.05.11 [React.js] 컴포넌트에서 svg 파일 import 하기 (0) 2023.04.27 [React.js] Cannot read properties of undefined 해결 (0) 2023.04.24 다음글이 없습니다.이전글이 없습니다.댓글