PdfUtil.java 15.3 KB
package com.sw.laryngoscope.utils;


import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.Color;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfDocumentInfo;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.canvas.draw.SolidLine;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.borders.Border;
import com.itextpdf.layout.element.Cell;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.LineSeparator;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Table;
import com.itextpdf.layout.element.Text;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
import com.sw.laryngoscope.R;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;

public class PdfUtil {
    public String TAG = "PdfUtil";

    public String txt_title = "病历报告单";

    public String txt_line1[] = {"姓名:", "dsdsqw66666666asddddddddddddddddddddd66666666666", "性别:",
            "nan", "年龄:", "35", "患者ID:", "136599786"};
    public String txt_line2[] = {"医院:", "dsdsqw66666666asdddddddddddddddd", "科室:", "sadsadasdsadsada"};

    public String picPath[] = { "/storage/emulated/0/DCIM/OPhoto/IMG_20230226_182900.jpg",
            "/storage/emulated/0/DCIM/OPhoto/IMG_20230226_182900.jpg",
            "/storage/emulated/0/DCIM/OPhoto/IMG_20230226_182900.jpg",
            "/storage/emulated/0/DCIM/OPhoto/IMG_20230226_182900.jpg",
            "/storage/emulated/0/DCIM/OPhoto/IMG_20230226_182900.jpg", };

    public String txt_record = "诊疗记录";
    public String txt_context = "诊疗要点: ";
    public String txt_doctor = "检查医生:";
    public String str_sign = "/storage/emulated/0/Signature/IMS_20230228184715.png";

    public String txt_date = "检查日期:  2023-03-01";

    public String sexual[] = {"男", "女"};
    String createTime;

    protected Context context;

    public PdfUtil(Context context) {
        this.context = context;
    }

    public void setParam(String name, int sex, String age, String patientid, String mainpoints,
                         String hospital, String department,
                         String sign, String pic[], String time) {
        sexual[0] = context.getString(R.string.string_male);
        sexual[1] = context.getString(R.string.string_female);

        txt_title = context.getString(R.string.string_case_report);

        txt_line1[0] = context.getString(R.string.string_name);
        txt_line1[1] = name;
        txt_line1[2] = context.getString(R.string.string_patient_sex);
        txt_line1[3] = sexual[sex];
        txt_line1[4] = context.getString(R.string.string_patient_age);
        txt_line1[5] = age;
        txt_line1[6] = context.getString(R.string.string_patient_id2);
        txt_line1[7] = patientid;

        txt_line2[0] = context.getString(R.string.string_hospital);
        txt_line2[1] = hospital;
        txt_line2[2] = context.getString(R.string.string_department);
        txt_line2[3] = department;

        picPath = pic;

        txt_record = context.getString(R.string.string_diagnosis);
        txt_context = context.getString(R.string.string_diagnosed_main_points) + " " + mainpoints;
        str_sign = sign;

        txt_date = context.getString(R.string.string_check_date) + "  " + time;
        createTime = time;

        txt_doctor = context.getString(R.string.string_examination_doctor);
    }

    public void resetParam() {
        txt_line1[1] = "";
        txt_line1[3] = "";
        txt_line1[5] = "";
        txt_line1[7] = "";
        txt_line2[1] = "";
        txt_line2[3] = "";
        picPath = new String[5];
        txt_context = "诊疗要点: ";
        str_sign = "";
        txt_date = "检查日期:  ";
    }

    public void createPDF(String path) {
        File file = new File(path);
        if (file.exists()) {
            file.delete();
        }
        file.getParentFile().mkdirs();

        // 创建Document
        PdfWriter writer = null;
        try {
            writer = new PdfWriter(new FileOutputStream(path));
        } catch (FileNotFoundException e) {
            Log.e(TAG, e.toString());
            if ( mPdfCallback != null ) {
                mPdfCallback.createPdfFail();
                return ;
            }
        }

        PdfDocument pdf_document = new PdfDocument(writer);
        // 生成的PDF文档信息
        PdfDocumentInfo info = pdf_document.getDocumentInfo();
        // 标题
        info.setTitle("病历报告单");
        // 作者
        //info.setAuthor("Quinto");
        // 科目
        info.setSubject("test");
        // 关键词
        info.setKeywords("pdf");
        // 创建日期
        info.setCreator(createTime);

        Document document = new Document(pdf_document, PageSize.A4, false);

        // 文字字体(显示中文)、大小、颜色
        PdfFont font = null;
        try {
            if ( context.getResources().getConfiguration().locale.getLanguage()
                    .equals("zh") ) {
                font = PdfFontFactory.createFont("STSong-Light","UniGB-UCS2-H");
            } else {
                font = PdfFontFactory.createFont();
            }
        } catch (IOException e) {
            Log.e(TAG, e.toString());
            if ( mPdfCallback != null ) {
                mPdfCallback.createPdfFail();
                return ;
            }
        }
        float title_size = 28.0f;
        float text_title_size = 20.0f;
        float text_size = 15.0f;
        Color black_color = new DeviceRgb(0, 0, 0);

        // 行分隔符
        // 实线:SolidLine()  点线:DottedLine()  仪表盘线:DashedLine()
        LineSeparator separator = new LineSeparator(new SolidLine());
        separator.setStrokeColor(new DeviceRgb(0, 0, 0));

        // 添加大标题
        Text title = new Text(txt_title).setFont(font).setFontSize(title_size).setFontColor(black_color);
        Paragraph paragraph_title = new Paragraph(title).setTextAlignment(TextAlignment.CENTER);
        paragraph_title.setMarginTop(0);
        paragraph_title.setRelativePosition(0, -30, 0, 0);
        document.add(paragraph_title);

        // 列数
        float[] pointColumnWidths = {70, 100, 70, 50, 70, 50, 70, 100};
        Table tablelin1 = new Table(pointColumnWidths);
        // 设置单元格文本居中
        tablelin1.setTextAlignment(TextAlignment.CENTER);
        // 添加单元格内容
        for (int i = 0; i < pointColumnWidths.length; i++) {
            Cell mcell = new Cell().setVerticalAlignment(VerticalAlignment.MIDDLE)
                    /*.setBackgroundColor(new DeviceRgb(43, 43 + i*10, 43 + i*10))*/;
            if ( i % 2 != 0 ) {
                mcell.setTextAlignment(TextAlignment.LEFT);
            }
            mcell.setMaxWidth(pointColumnWidths[i]).setMaxHeight(35).setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER);
            Text text = new Text(txt_line1[i]).setFont(font).setFontSize(text_size).setFontColor(black_color);
            tablelin1.addCell(mcell.add(new Paragraph(text)));
        }
        tablelin1.setRelativePosition(0, -20, 0, 0);
        // 将表格添加进pdf文件
        document.add(tablelin1);

        float[] pointColumnWidths2 = {70, 205, 70, 220};
        Table tablelin2 = new Table(pointColumnWidths2);
        tablelin2.setTextAlignment(TextAlignment.CENTER);
        for (int i = 0; i < pointColumnWidths2.length; i++) {
            Cell mcell= new Cell().setVerticalAlignment(VerticalAlignment.MIDDLE);
            if ( i % 2 != 0 ) {
                mcell.setTextAlignment(TextAlignment.LEFT);
            }
            mcell.setMaxWidth(pointColumnWidths2[i]).setMaxHeight(35).setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER);
            Text text = new Text(txt_line2[i]).setFont(font).setFontSize(text_size).setFontColor(black_color);
            tablelin2.addCell(mcell.add(new Paragraph(text)));
        }
        tablelin2.setRelativePosition(0, -10, 0, 0);
        document.add(tablelin2);

        /**
         * 添加图片
         */
        try {
            if ( picPath != null && picPath.length > 0 ) {
                Table tablepic = new Table( new float[] {150f, 150f, 150f, 150f,} );
                tablepic.setTextAlignment(TextAlignment.CENTER);
                tablepic.setMaxWidth(tablelin2.getWidth());
                for (int i = 0; i <= picPath.length; i++) {
                    Cell mcell = new Cell().setVerticalAlignment(VerticalAlignment.MIDDLE);
                    Image image;
                    if ( i < picPath.length ) {
                        image = new Image(
                                ImageDataFactory.create(picPath[i]));
                        image.setMaxWidth(100).setMaxHeight(100);
                        //image.setAutoScaleWidth(true);
                        mcell.add(image);
                    } else {
                        mcell = new Cell(2, 2 * tablepic.getNumberOfColumns() - picPath.length).add(
                                new Paragraph(new Text("")));
                    }
                    if ( i < 4 ) {
                        mcell.setMaxHeight(110).setPadding(5).setBorderLeft(Border.NO_BORDER)
                                .setBorderRight(Border.NO_BORDER).setBorderBottom(Border.NO_BORDER);
                    } else {
                        mcell.setMaxHeight(110).setPadding(5).setBorderLeft(Border.NO_BORDER)
                                .setBorderRight(Border.NO_BORDER).setBorderTop(Border.NO_BORDER);
                    }
                    tablepic.addCell(mcell);
                }
                tablepic.setRelativePosition(0, 0, 0, 0);
                document.add(tablepic);
            }
        } catch (MalformedURLException e) {
            Log.e(TAG, e.toString());
            if ( mPdfCallback != null ) {
                mPdfCallback.createPdfFail();
                return ;
            }
        }

        Text txtreacordtitle = new Text(txt_record).setFont(font).setFontSize(text_title_size).setFontColor(black_color);
        Paragraph paragraph_record_title = new Paragraph(txtreacordtitle).setTextAlignment(TextAlignment.LEFT);
        paragraph_record_title.setMarginTop(10);
        document.add(paragraph_record_title);

        Text txtreacord = new Text(txt_context)
                .setFont(font).setFontSize(text_size).setFontColor(black_color);
        Paragraph paragraph_record = new Paragraph(txtreacord).setTextAlignment(TextAlignment.LEFT);
        paragraph_record.setMarginTop(0);
        //设置段落的第一行缩进
        paragraph_record.setFirstLineIndent(35);
        document.add(paragraph_record);

        Text txtDoctor = new Text(txt_doctor).setFont(font).setFontSize(text_size).setFontColor(black_color);
        Paragraph paragraph_doctor = new Paragraph(txtDoctor).setTextAlignment(TextAlignment.RIGHT);
        //paragraph_doctor.setMarginTop(20);
        //paragraph_doctor.setMarginRight(150);
        paragraph_doctor.setFixedPosition(pdf_document.getNumberOfPages(), PageSize.A4.getWidth() - 300,
                150, 150);
        document.add(paragraph_doctor);

        try {
            if ( str_sign != null && !str_sign.isEmpty() ) {
                Image image_sign = new Image(ImageDataFactory.create(str_sign));
                image_sign.setMaxWidth(120).setMaxHeight(70);
                Paragraph paragraph_sign = new Paragraph().add(image_sign).setTextAlignment(TextAlignment.RIGHT);
                paragraph_sign.setFixedPosition(pdf_document.getNumberOfPages(), PageSize.A4.getWidth() - 180,
                        90, 150);
                document.add(paragraph_sign);
            }
        } catch (MalformedURLException e) {
            Log.e(TAG, e.toString());
            if ( mPdfCallback != null ) {
                mPdfCallback.createPdfFail();
                return ;
            }
        }

        Text txtdate = new Text(txt_date).setFont(font).setFontSize(text_size).setFontColor(black_color);
        Paragraph paragraph_date = new Paragraph(txtdate).setTextAlignment(TextAlignment.RIGHT);
        paragraph_date.setFixedPosition(pdf_document.getNumberOfPages(), PageSize.A4.getWidth() - 239,
                60, 230);
        document.add(paragraph_date);

        document.flush();

        /**
         * 添加页眉、页脚、水印
         */
        Rectangle pageSize;
        PdfCanvas canvas;
        int n = pdf_document.getNumberOfPages();
        Logger.d("getNumberOfPages " + n);
        for (int i = 1; i <= n; i++) {
            PdfPage page = pdf_document.getPage(i);
            Logger.d("getNumberOfPages pageSize " + page);
            pageSize = page.getPageSize();
            canvas = new PdfCanvas(page);
            canvas.beginText().setFontAndSize(font, 10)
                    .moveText(pageSize.getWidth() / 2 - 6, 10)
                    .showText(String.valueOf(i))
                    .endText();

            Logger.d("getNumberOfPages " + i);
        }
        Logger.d("document close");

        // 关闭
        document.close();
        //Toast.makeText(this, "PDF文件已生成", Toast.LENGTH_SHORT).show();
        if ( mPdfCallback != null ) {
            mPdfCallback.createPdfSuc("");
        }

        resetParam();
    }

    public void saveViewBitmap(View view, String path, String name){
        view.setDrawingCacheEnabled(true);
        Bitmap bitmap = null;
        try{
            if ( null != view.getDrawingCache() ) {
                bitmap = Bitmap.createScaledBitmap(
                        view.getDrawingCache(), 120, 120, false );
                saveImage(bitmap, path, name);
                Logger.d("saveViewBitmap ");
            }
        } catch ( OutOfMemoryError e ) {
            e.printStackTrace();
            Logger.d("saveViewBitmap " + e.toString());
        } finally {
            view.setDrawingCacheEnabled(false);
            view.destroyDrawingCache();
        }
    }
    public void saveImage(Bitmap bmp, String path, String name) {
        FileOutputStream out = null;
        try {
            File folder = new File(path);
            if ( !folder.exists() ) {
                folder.mkdirs();
            }
            File file = new File(folder, name);
            out = new FileOutputStream(file);
            bmp.compress(Bitmap.CompressFormat.PNG, 100, out); // bmp is your Bitmap instance
            Logger.d("saveImage ");
        } catch (Exception e) {
            Logger.d("saveImage " + e.toString());
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (Exception e) {
            }
        }
    }

    public pdfCallback mPdfCallback;

    public void setPdfCallback(pdfCallback pdfCallback) {
        this.mPdfCallback = pdfCallback;
    }

    public interface pdfCallback {
        void createPdfSuc(String path);
        void createPdfFail();
    }

 
}