프로그램/Android

안드로이드 레이아웃 PDF 변환

잡식성초보 2019. 2. 26. 10:18

안드로이드 레이아웃 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








반응형