반응형
안드로이드 레이아웃 PDF파일로 변환 방법입니다.
itextpdf 라는 라이브러리를 이용하여 간단하게 변환 시킬것입니다.
기본적으로 돌아가는 구조는 현재 레이아웃을 jpg 이미지로 변환하여 저장한 후
그 저장된 이미지 파일을 읽어서 PDF을 만듭니다. 이렇게 되면 파일이 2개가 생기게 되므로
이미지로 만든 파일은 PDF파일로 변환후 삭제하는 방식으로 샘플코드를 만들었습니다.
Gradle에 추가해야할 라이브러리 입니다.
implementation 'com.itextpdf:itextpdf:5.0.6'
이미지파일을 만드는중 레이아웃을 Bitmap으로 변환하는 방법이 아래와 같습니다.(relativeLayout 최상단 레이아웃)
relativeLayout.setDrawingCacheEnabled(true); relativeLayout.buildDrawingCache(); Bitmap bm = relativeLayout.getDrawingCache();
하지만 위의 Bitmap 변환 하는 방법이 API28부터는 deprecated 되었습니다.
그래서 아래와 같이 변환방법을 바꿨습니다.
Bitmap bm = Bitmap.createBitmap(relativeLayout.getWidth(), relativeLayout.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bm); Drawable bgDrawable = relativeLayout.getBackground(); if (bgDrawable != null) { bgDrawable.draw(canvas); } else { canvas.drawColor(Color.WHITE); } relativeLayout.draw(canvas);
아래 소스코드 함수를 호출하면 파일폴더에 저장되어 있습니다.
사용하실때는 기본적으로 권한을 얻으셔야 하며 원하는 저장위치, 파일명을 변경하여 사용하시면 될것입니다.
import 영역과 함수 소스입니다.
import com.itextpdf.text.Document; import com.itextpdf.text.Image; import com.itextpdf.text.pdf.PdfWriter; public void layoutToImage() { Bitmap bm = Bitmap.createBitmap(relativeLayout.getWidth(), relativeLayout.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bm); Drawable bgDrawable = relativeLayout.getBackground(); if (bgDrawable != null) { bgDrawable.draw(canvas); } else { canvas.drawColor(Color.WHITE); } relativeLayout.draw(canvas); ByteArrayOutputStream bytes = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.JPEG, 100, bytes); File f = new File(Environment.getExternalStorageDirectory() + File.separator + "image.jpg"); try { f.createNewFile(); FileOutputStream fo = new FileOutputStream(f); fo.write(bytes.toByteArray()); Document document = new Document(); dirpath = Environment.getExternalStorageDirectory().toString(); PdfWriter.getInstance(document, new FileOutputStream(dirpath + "/newPDF.pdf")); document.open(); Image image = Image.getInstance(f.toString()); float scaler = ((document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin() - 0) / image.getWidth()) * 100; image.scalePercent(scaler); image.setAlignment(Image.ALIGN_CENTER | Image.ALIGN_TOP); document.add(image); document.close(); Toast.makeText(this, "PDF 파일 저장성공", Toast.LENGTH_SHORT).show(); f.delete(); } catch (Exception e) { e.printStackTrace(); } }
하위 소스대로 작업을 한다면 아래와 같은 사진 결과를 보실수 있습니다.
(테스트폰에 결함이 있어서 빨간줄이 있습니다^^;;)
Layout convert Pdf file in android
반응형
'프로그램 > Android' 카테고리의 다른 글
안드로이드 드래그앤 드롭(drag&drop) 사용법 (0) | 2020.07.03 |
---|---|
안드로이드 세로 ViewPager (0) | 2019.03.04 |
안드로이드 FCM 푸시(2.페이로드 및 테스트) (1) | 2019.01.03 |
안드로이드 FCM 푸시(1.프로젝트 셋팅 및 구현) (1) | 2019.01.03 |
안드로이드 SNS 카카오톡 로그인 (0) | 2018.11.15 |