Выходной PDF-файл Springboot

Spring Boot

предисловие

Кто-то (мертвый спрос) подошел и сказал вам, что они будут выведены мне в виде отчета в формате pdf, поэтому у меня есть следующее, делайте заметки и приходите и берите это непосредственно в будущем. Я искал в Интернете и обнаружил, что все используют itext. iText — известный открытый проект, библиотека классов Java для создания PDF-документов. С помощью iText вы можете не только создавать документы PDF или rtf, но и преобразовывать файлы XML и Html в файлы PDF.

itextpdf.com/

maven-зависимости

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.10</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

Основная операция

itext имеет много функций, вот основные операции. Для других более сложных операций вы можете продолжать видеть следующее. Основные этапы обработки в псевдокоде следующие:

//Step 1—Create a Document.  
Document document = new Document();  
//Step 2—Get a PdfWriter instance.  
PdfWriter.getInstance(document, new FileOutputStream(FILE_DIR + "createSamplePDF.pdf"));  
//Step 3—Open the Document.  
document.open();  
//Step 4—Add content.  
document.add(new Paragraph("Hello World"));  
//Step 5—Close the Document.  
document.close();  

1. Прямые выходные данные в файл pdf

Особое примечание заключается в том, что для китайского языка необходимо указать шрифт, то есть BaseFont.

public class PDFReport {

    private final static String REPORT_PATH = "C:/air-navi-monitor/report";

    private static void exportReport() {
        BaseFont bf;
        Font font = null;
        Font font2 = null;
        try {
          
            bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
                    BaseFont.NOT_EMBEDDED);//创建字体
            font = new Font(bf, 12);//使用字体
            font2 = new Font(bf, 12, Font.BOLD);//使用字体
        } catch (Exception e) {
            e.printStackTrace();
        }
        Document document = new Document();
        try {
            PdfWriter.getInstance(document, new FileOutputStream("E:/2.pdf"));
            document.open();
            Paragraph elements = new Paragraph("常州武进1区飞行报告", font2);
            elements.setAlignment(Paragraph.ALIGN_CENTER);
            document.add(elements);
            Image png = Image.getInstance("E:\\test.png");
            png.setAlignment(Image.ALIGN_CENTER);
            document.add(png);
            document.add(new Paragraph("任务编号:20190701        开始日期:20190701", font));
            document.add(new Paragraph("任务名称:常州武进1区     结束日期:20190701", font));
            document.add(new Paragraph("平均飞行高度:100m        平均飞行速度:100km/h", font));
            document.add(new Paragraph("任务面积:1000㎡      结束日期:20190701", font));
            document.add(new Paragraph("飞行总时长:1000㎡", font));
            document.addCreationDate();

            document.close();
        } catch (Exception e) {
            System.out.println("file create exception");
        }
    }

    /**
     * 生成pdf文件
     *
     * @param missionReport
     * @return
     */
    public static String exportReport(MissionReportTb missionReport) throws AirNaviException {
        String pdfPath = null;
        String imgPath = Shape2Image.getImgPath(missionReport.getMissionID());
//        String imgPath = "E:\\test.png";
        String finalReportStr = missionReport.getMissionReport();
        MissionReport finalReport = JSONObject.parseObject(finalReportStr, MissionReport.class);
        BaseFont bf;
        Font font = null;
        Font font2 = null;
        try {
            bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",
                    BaseFont.NOT_EMBEDDED);//创建字体
            font = new Font(bf, 12);//使用字体
            font2 = new Font(bf, 12, Font.BOLD);//使用字体
        } catch (Exception e) {
            e.printStackTrace();
        }
        Document document = new Document();
        try {
            File dir = new File(REPORT_PATH);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            File file = new File(REPORT_PATH + File.separator + missionReport.getMissionID() + ".pdf");
            if (!file.exists()) {
                file.createNewFile();
            }
            PdfWriter.getInstance(document, new FileOutputStream(REPORT_PATH + File.separator + missionReport.getMissionID() + ".pdf"));
            document.open();
            Paragraph elements = new Paragraph(missionReport.getMissionName() + "飞行报告", font2);
            elements.setAlignment(Paragraph.ALIGN_CENTER);
            document.add(elements);
            Image png = Image.getInstance(imgPath);
//            https://blog.csdn.net/lingbo89/article/details/76177825
            float documentWidth = document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin();
            float documentHeight = documentWidth / 580 * 320;//重新设置宽高
            png.scaleAbsolute(documentWidth, documentHeight);//重新设置宽高
            png.scalePercent(50);
            // 根据域的大小缩放图片
//            image.scaleToFit(signRect.getWidth(), signRect.getHeight());
            png.setAlignment(Image.ALIGN_CENTER);
            document.add(png);
            document.add(new Paragraph("任务编号:" + missionReport.getMissionCode() + ",开始日期:" + finalReport.getStartTime(), font));
            document.add(new Paragraph("任务名称:" + missionReport.getMissionName() + ",结束日期:" + finalReport.getEndTime(), font));
            document.add(new Paragraph("平均飞行高度:" + finalReport.getAvgFlightHeight() + "m" + ",平均飞行速度:" + finalReport.getAvgFlightSpeed() + "km/h", font));
            document.add(new Paragraph("任务面积:" + finalReport.getMissionArea() + "㎡" + ",飞行总时长:" + finalReport.getFlightDuration() + "min", font));
            document.addCreationDate();
            document.close();
            pdfPath = file.getAbsolutePath();
        } catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage());
            System.out.println("file create exception");
            throw new AirNaviException("生成PDF失败:" + e.getMessage());
        }

        return pdfPath;
    }

    public static void main(String[] args) throws AirNaviException {
        String report = "{\"detailMissionReport\":[{\"avgFlightHeight\":119.7,\"avgFlightSpeed\":71.1,\"endPoint\":\"113.27484,22.86843\",\"endTime\":\"2019-09-17 17:47:07\",\"flightDuration\":9,\"reportID\":1,\"startPoint\":\"113.31429,22.78240\",\"startTime\":\"2019-09-17 17:38:03\",\"statisticsTimes\":505}],\"missionReport\":{\"avgFlightHeight\":119.7,\"avgFlightSpeed\":71.1,\"endPoint\":\"113.31429,22.78240\",\"endTime\":\"2019-09-17 17:47:07\",\"flightDuration\":9,\"reportID\":1,\"startPoint\":\"113.31429,22.78240\",\"startTime\":\"2019-09-17 17:38:03\",\"statisticsTimes\":0},\"missionArea\":0.0,\"missionCode\":\"M001\",\"missionID\":\"888813ddef6646cd9bfaba5abb748a43\",\"missionName\":\"德胜航点M008\",\"missionStatus\":1,\"missionType\":0,\"plannedFlightTime\":\"20190909\"}";
        MissionReportTb missionReportTb = JSONObject.parseObject(report, MissionReportTb.class);
        exportReport(missionReportTb);
    }

}

2. Сгенерируйте pdf-файл по шаблону и экспортируйте его

Сначала вы делаете шаблон PDF:

1. Сначала используйте слово, чтобы создать интерфейс шаблона

2. Сохраните файл в формате PDF.

3. Откройте файл PDF, только что преобразованный с помощью слова, с помощью программного обеспечения Adobe Acrobat pro (Примечание: если у вас нет этого программного обеспечения, вы можете загрузить его через мое облако Baidu, ссылка:Disk.Baidu.com/Yes/1PL2 прочитайте этот пост)…

4. Нажмите кнопку «Подготовить форму» справа, выберите «Test.pdf» и выберите «Начать».

Перейдите на страницу редактирования, она автоматически обнаружит и назовет поле формы после открытия, щелкните правой кнопкой мыши поле формы, нажмите «Свойства», появится диалоговое окно свойств текстового поля (на самом деле никаких действий не требуется, в общем, есть ничего менять не нужно, по крайней мере я не менял.. Если вы хотите изменить информацию, такую ​​как fill1, вы можете изменить ее)

5. После выполнения вышеуказанной работы просто «сохранить как», чтобы сохранить PDF

Вышеупомянутая часть представляет собой операцию создания шаблона PDF.После выполнения вышеуказанного файл PDF создается в соответствии с шаблоном PDF через программу, и используется программа Java:

public class Snippet {
// 利用模板生成pdf
    public static void fillTemplate() {
// 模板路径
        String templatePath = "E:/测试3.pdf";
// 生成的新文件路径
        String newPDFPath = "E:/ceshi.pdf";
        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        try {
            out = new FileOutputStream(newPDFPath);// 输出流
            reader = new PdfReader(templatePath);// 读取pdf模板
            bos = new ByteArrayOutputStream();
            stamper = new PdfStamper(reader, bos);
            AcroFields form = stamper.getAcroFields();
            String[] str = {"123456789", "TOP__ONE", "男", "1991-01-01", "130222111133338888", "河北省保定市"};
            int i = 0;
            java.util.Iterator<String> it = form.getFields().keySet().iterator();
            while (it.hasNext()) {
                String name = it.next().toString();
                System.out.println(name);
                form.setField(name, str[i++]);
            }
            stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
            stamper.close();
            Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importPage);
            doc.close();
        } catch (IOException e) {
            System.out.println(1);
        } catch (DocumentException e) {
            System.out.println(2);
        }
    }

    public static void main(String[] args) {
        fillTemplate();
    }
}

Текущий результат выглядит следующим образом

Больше действий

1. Размер страницы, цвет фона страницы, поля, заголовок, автор, тема, ключевые слова.

Основной код:

//页面大小  
Rectangle rect = new Rectangle(PageSize.B5.rotate());  
//页面背景色  
rect.setBackgroundColor(BaseColor.ORANGE);  
  
Document doc = new Document(rect);  
  
PdfWriter writer = PdfWriter.getInstance(doc, out);  
  
//PDF版本(默认1.4)  
writer.setPdfVersion(PdfWriter.PDF_VERSION_1_2);  
  
//文档属性  
doc.addTitle("Title@sample");  
doc.addAuthor("Author@rensanning");  
doc.addSubject("Subject@iText sample");  
doc.addKeywords("Keywords@iText");  
doc.addCreator("Creator@iText");  
  
//页边空白  
doc.setMargins(10, 20, 30, 40);  
  
doc.open();  
doc.add(new Paragraph("Hello World")); 

Выходной результат:

2. Установите пароль

Основной код:

PdfWriter writer = PdfWriter.getInstance(doc, out);  
  
// 设置密码为:"World"  
writer.setEncryption("Hello".getBytes(), "World".getBytes(),  
        PdfWriter.ALLOW_SCREENREADERS,  
        PdfWriter.STANDARD_ENCRYPTION_128);  
  
doc.open();  
doc.add(new Paragraph("Hello World"));  

Выходной результат:

3. Добавить страницу Основной код:

document.open();  
document.add(new Paragraph("First page"));  
document.add(new Paragraph(Document.getVersion()));  
  
document.newPage();  
writer.setPageEmpty(false);  
  
document.newPage();  
document.add(new Paragraph("New page"));  

4. Добавьте водяной знак (фоновое изображение)

//图片水印  
PdfReader reader = new PdfReader(FILE_DIR + "setWatermark.pdf");  
PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(FILE_DIR  
        + "setWatermark2.pdf"));  
  
Image img = Image.getInstance("resource/watermark.jpg");  
img.setAbsolutePosition(200, 400);  
PdfContentByte under = stamp.getUnderContent(1);  
under.addImage(img);  
  
//文字水印  
PdfContentByte over = stamp.getOverContent(2);  
over.beginText();  
BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI,  
        BaseFont.EMBEDDED);  
over.setFontAndSize(bf, 18);  
over.setTextMatrix(30, 30);  
over.showTextAligned(Element.ALIGN_LEFT, "DUPLICATE", 230, 430, 45);  
over.endText();  
  
//背景图  
Image img2 = Image.getInstance("resource/test.jpg");  
img2.setAbsolutePosition(0, 0);  
PdfContentByte under2 = stamp.getUnderContent(3);  
under2.addImage(img2);  
  
stamp.close();  
reader.close();  

5. Вставьте фрагмент, фразу, абзац, список основной код

//Chunk对象: a String, a Font, and some attributes  
document.add(new Chunk("China"));  
document.add(new Chunk(" "));  
Font font = new Font(Font.FontFamily.HELVETICA, 6, Font.BOLD, BaseColor.WHITE);  
Chunk id = new Chunk("chinese", font);  
id.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f);  
id.setTextRise(6);  
document.add(id);  
document.add(Chunk.NEWLINE);  
  
document.add(new Chunk("Japan"));  
document.add(new Chunk(" "));  
Font font2 = new Font(Font.FontFamily.HELVETICA, 6, Font.BOLD, BaseColor.WHITE);  
Chunk id2 = new Chunk("japanese", font2);  
id2.setBackground(BaseColor.BLACK, 1f, 0.5f, 1f, 1.5f);  
id2.setTextRise(6);  
id2.setUnderline(0.2f, -2f);  
document.add(id2);  
document.add(Chunk.NEWLINE);  
  
//Phrase对象: a List of Chunks with leading  
document.newPage();  
document.add(new Phrase("Phrase page"));  
  
Phrase director = new Phrase();  
Chunk name = new Chunk("China");  
name.setUnderline(0.2f, -2f);  
director.add(name);  
director.add(new Chunk(","));  
director.add(new Chunk(" "));  
director.add(new Chunk("chinese"));  
director.setLeading(24);  
document.add(director);  
  
Phrase director2 = new Phrase();  
Chunk name2 = new Chunk("Japan");  
name2.setUnderline(0.2f, -2f);  
director2.add(name2);  
director2.add(new Chunk(","));  
director2.add(new Chunk(" "));  
director2.add(new Chunk("japanese"));  
director2.setLeading(24);  
document.add(director2);  
          
//Paragraph对象: a Phrase with extra properties and a newline  
document.newPage();  
document.add(new Paragraph("Paragraph page"));  
  
Paragraph info = new Paragraph();  
info.add(new Chunk("China "));  
info.add(new Chunk("chinese"));  
info.add(Chunk.NEWLINE);  
info.add(new Phrase("Japan "));  
info.add(new Phrase("japanese"));  
document.add(info);  
  
//List对象: a sequence of Paragraphs called ListItem  
document.newPage();  
List list = new List(List.ORDERED);  
for (int i = 0; i < 10; i++) {  
    ListItem item = new ListItem(String.format("%s: %d movies",  
            "country" + (i + 1), (i + 1) * 100), new Font(  
            Font.FontFamily.HELVETICA, 6, Font.BOLD, BaseColor.WHITE));  
    List movielist = new List(List.ORDERED, List.ALPHABETICAL);  
    movielist.setLowercase(List.LOWERCASE);  
    for (int j = 0; j < 5; j++) {  
        ListItem movieitem = new ListItem("Title" + (j + 1));  
        List directorlist = new List(List.UNORDERED);  
        for (int k = 0; k < 3; k++) {  
            directorlist.add(String.format("%s, %s", "Name1" + (k + 1),  
                    "Name2" + (k + 1)));  
        }  
        movieitem.add(directorlist);  
        movielist.add(movieitem);  
    }  
    item.add(movielist);  
    list.add(item);  
}  
document.add(list);  

6. Вставьте форму

PdfPTable table = new PdfPTable(3);  
PdfPCell cell;  
cell = new PdfPCell(new Phrase("Cell with colspan 3"));  
cell.setColspan(3);  
table.addCell(cell);  
cell = new PdfPCell(new Phrase("Cell with rowspan 2"));  
cell.setRowspan(2);  
table.addCell(cell);  
table.addCell("row 1; cell 1");  
table.addCell("row 1; cell 2");  
table.addCell("row 2; cell 1");  
table.addCell("row 2; cell 2");  
  
document.add(table);  

7. Вложение форм

PdfPTable table = new PdfPTable(4);  
  
//1行2列  
PdfPTable nested1 = new PdfPTable(2);  
nested1.addCell("1.1");  
nested1.addCell("1.2");  
  
//2行1列  
PdfPTable nested2 = new PdfPTable(1);  
nested2.addCell("2.1");  
nested2.addCell("2.2");  
  
//将表格插入到指定位置  
for (int k = 0; k < 24; ++k) {  
    if (k == 1) {  
        table.addCell(nested1);  
    } else if (k == 20) {  
        table.addCell(nested2);  
    } else {  
        table.addCell("cell " + k);  
    }  
}  
  
document.add(table);  

8. Установите заголовок

String[] bogusData = { "M0065920", "SL", "FR86000P", "PCGOLD",  
        "119000", "96 06", "2001-08-13", "4350", "6011648299",  
        "FLFLMTGP", "153", "119000.00" };  
int NumColumns = 12;  
// 12  
PdfPTable datatable = new PdfPTable(NumColumns);  
int headerwidths[] = { 9, 4, 8, 10, 8, 11, 9, 7, 9, 10, 4, 10 }; // percentage  
datatable.setWidths(headerwidths);  
datatable.setWidthPercentage(100);  
datatable.getDefaultCell().setPadding(3);  
datatable.getDefaultCell().setBorderWidth(2);  
datatable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);  
  
datatable.addCell("Clock #");  
datatable.addCell("Trans Type");  
datatable.addCell("Cusip");  
datatable.addCell("Long Name");  
datatable.addCell("Quantity");  
datatable.addCell("Fraction Price");  
datatable.addCell("Settle Date");  
datatable.addCell("Portfolio");  
datatable.addCell("ADP Number");  
datatable.addCell("Account ID");  
datatable.addCell("Reg Rep ID");  
datatable.addCell("Amt To Go ");  
  
datatable.setHeaderRows(1);  
  
//边框  
datatable.getDefaultCell().setBorderWidth(1);  
  
//背景色  
for (int i = 1; i < 1000; i++) {  
    for (int x = 0; x < NumColumns; x++) {  
        datatable.addCell(bogusData[x]);  
    }  
}  
  
document.add(datatable);

Место ограничено, если вам нужно больше операций, вы можете обратиться к статье:блог woo woo woo.cn on.com/know 970/…

Наконец

Если вы заинтересованы в Java и больших данных, нажмите и удерживайте QR-код, чтобы следовать за волной, и я сделаю все возможное, чтобы принести вам пользу. Если вы думаете, что это поможет вам хоть немного, пожалуйста, лайкните или сделайте ретвит. Обратите внимание на публичный аккаунт** [love code],Ответить2019** содержит соответствующую информацию.