<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Spring Boot iText 教程 > 原文: [http://zetcode.com/articles/springbootitext/](http://zetcode.com/articles/springbootitext/) 在本教程中,我們將展示如何使用 iText 和 Spring Boot 創建 PDF 報告。 數據是從 H2 內存數據庫中的表加載的。 iText 是一個開放源代碼庫,用于在 Java 中創建和處理 PDF 文件。 Spring 是用于開發 Java 企業應用的 Java 應用框架。 它還有助于集成各種企業組件。 Spring Boot 使創建具有 Spring 動力的生產級應用和服務變得很容易,而對安裝的要求卻最低。 H2 是完全用 Java 實現的開源關系數據庫管理系統。 它可以嵌入 Java 應用中或以客戶端-服務器模式運行。 它占地面積小,易于部署和安裝。 它包含一個基于瀏覽器的控制臺應用,用于查看和編輯數據庫表。 `JdbcTemplate`是一個 Spring 庫,可以幫助程序員創建與關系數據庫和 JDBC 一起使用的應用。 它會處理許多繁瑣且容易出錯的底層細節,例如處理事務,清理資源以及正確處理異常。 `JdbcTemplate`在 Spring 的`spring-jdbc`模塊中提供。 ## 應用 以下 Spring Boot 應用從數據庫表中加載數據,并使用 iText 庫從中生成 PDF 報告。 該應用與嵌入式 Tomcat 服務器一起運行。 ```java ├── pom.xml └── src ├── main │ ├── java │ │ └── com │ │ └── zetcode │ │ ├── Application.java │ │ ├── bean │ │ │ └── Car.java │ │ ├── conf │ │ │ └── AppConfig.java │ │ ├── controller │ │ │ └── MyController.java │ │ ├── service │ │ │ ├── CarService.java │ │ │ └── ICarService.java │ │ └── view │ │ ├── AbstractPdfView.java │ │ └── MyPdfView.java │ └── resources │ ├── application.yml │ ├── data-h2.sql │ ├── schema-h2.sql │ └── static │ └── index.html └── test └── java ``` 這是項目結構。 `pom.xml` ```java <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>SpringBootItext</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.3.RELEASE</version> </parent> <dependencies> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>4.2.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ``` Maven `pom.xml`文件包含 iText 庫,H2 驅動程序和 Spring 框架的依賴項。 `Car.java` ```java package com.zetcode.bean; public class Car { private Long id; private String name; private int price; public Car() {} public Car(Long id, String name, int price) { this.id = id; this.name = name; this.price = price; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public String toString() { return "Car{" + "id=" + id + ", name=" + name + ", price=" + price + '}'; } } ``` 這是`Car` bean 類。 它包含商品 ID,名稱和價格。 `application.yml` ```java datasource: url: jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE username: sa password: driverClassName: org.h2.Driver spring: datasource: platform: h2 h2: console: enabled: true path: /console/ ``` `application.yml`是主要的 Spring Boot 配置文件。 它包含數據源和 MVC 設置。 我們選擇了 H2 作為數據庫系統。 數據庫在內存中運行。 我們啟用基于瀏覽器的控制臺應用。 ```java url: jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE ``` 數據庫名稱為`testdb`,并在內存中創建。 (當 Spring Boot 在 Maven POM 文件中發現 H2 時,它會自動創建一個內存數據庫,但我們將展示如何顯式地執行該操作。) ```java spring: datasource: platform: h2 ``` 該平臺值用在 SQL 初始化腳本中:`schema-${platform}.sql`和`data-${platform}.sql`。 ```java h2: console: enabled: true path: /console/ ``` H2 Web 控制臺應用已啟用; 在`localhost:8080/console/`路徑中可用。 `schema-h2.sql` ```java CREATE TABLE Cars(ID BIGINT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(30), PRICE INT); ``` 該 SQL 腳本創建`Cars`表。 `data-h2.sql` ```java INSERT INTO Cars(Name, Price) VALUES('Audi', 52642); INSERT INTO Cars(Name, Price) VALUES('Mercedes', 57127); INSERT INTO Cars(Name, Price) VALUES('Skoda', 9000); INSERT INTO Cars(Name, Price) VALUES('Volvo', 29000); INSERT INTO Cars(Name, Price) VALUES('Bentley', 350000); INSERT INTO Cars(Name, Price) VALUES('Citroen', 21000); INSERT INTO Cars(Name, Price) VALUES('Hummer', 41400); INSERT INTO Cars(Name, Price) VALUES('Volkswagen', 21600); ``` 該腳本用數據填充表。 這兩個腳本都位于類路徑的根目錄中。 `AppConfig.java` ```java package com.zetcode.conf; import javax.sql.DataSource; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; @Configuration public class AppConfig { @Bean @Primary @ConfigurationProperties(prefix = "datasource") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } } ``` `AppConfig`是 Java 配置類。 它從`application.yml`配置文件創建數據源 bean。 `AbstractPdfView.java` ```java package com.zetcode.view; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.PageSize; import com.itextpdf.text.pdf.PdfWriter; import java.io.ByteArrayOutputStream; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.view.AbstractView; public abstract class AbstractPdfView extends AbstractView { public AbstractPdfView() { initView(); } private void initView() { setContentType("application/pdf"); } @Override protected boolean generatesDownloadContent() { return true; } @Override protected final void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { ByteArrayOutputStream baos = createTemporaryOutputStream(); Document document = new Document(PageSize.A4); PdfWriter writer = PdfWriter.getInstance(document, baos); prepareWriter(model, writer, request); buildPdfMetadata(model, document, request); document.open(); buildPdfDocument(model, document, writer, request, response); document.close(); writeToResponse(response, baos); } protected void prepareWriter(Map<String, Object> model, PdfWriter writer, HttpServletRequest request) throws DocumentException { writer.setViewerPreferences(getViewerPreferences()); } protected int getViewerPreferences() { return PdfWriter.ALLOW_PRINTING | PdfWriter.PageLayoutSinglePage; } protected void buildPdfMetadata(Map<String, Object> model, Document document, HttpServletRequest request) { } protected abstract void buildPdfDocument(Map<String, Object> model, Document document, PdfWriter writer, HttpServletRequest request, HttpServletResponse response) throws Exception; } ``` Spring 的`AbstractPdfView`基于舊的`iText`庫。 因此,我們需要創建自己的抽象類,該抽象類基本上是具有更新的導入的副本。 `MyPdfView.java` ```java package com.zetcode.view; import com.itextpdf.text.Document; import com.itextpdf.text.Element; import com.itextpdf.text.Font; import com.itextpdf.text.FontFactory; import com.itextpdf.text.Phrase; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; import com.zetcode.bean.Car; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyPdfView extends AbstractPdfView { @Override protected void buildPdfDocument(Map<String, Object> model, Document document, PdfWriter writer, HttpServletRequest request, HttpServletResponse response) throws Exception { List<Car> cars = (List<Car>) model.get("cars"); PdfPTable table = new PdfPTable(3); table.setWidthPercentage(60); table.setWidths(new int[] {1, 3, 3}); Font headFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD); PdfPCell hcell; hcell = new PdfPCell(new Phrase("Id", headFont)); hcell.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(hcell); hcell = new PdfPCell(new Phrase("Name", headFont)); hcell.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(hcell); hcell = new PdfPCell(new Phrase("Price", headFont)); hcell.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(hcell); for (Car car : cars) { PdfPCell cell; cell = new PdfPCell(new Phrase(car.getId().toString())); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(cell); cell = new PdfPCell(new Phrase(car.getName())); cell.setPaddingLeft(5); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_LEFT); table.addCell(cell); cell = new PdfPCell(new Phrase(String.valueOf(car.getPrice()))); cell.setVerticalAlignment(Element.ALIGN_MIDDLE); cell.setHorizontalAlignment(Element.ALIGN_RIGHT); cell.setPaddingRight(5); table.addCell(cell); } document.add(table); } } ``` `MyPdfView`繼承自定制的`AbstractPdfView`。 在`buildPdfDocument()`方法中,我們生成 PDF 文件。 ```java List<Car> cars = (List<Car>) model.get("cars"); ``` 首先,我們從模型中獲取數據。 ```java PdfPTable table = new PdfPTable(3); ``` 我們將數據放在表格中; 為此,我們有`PdfPTable`類。 該表包含三列:ID,名稱和價格。 ```java Font headFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD); ``` 對于表頭,我們使用粗體的 Helvetica 字體。 ```java PdfPCell hcell; hcell = new PdfPCell(new Phrase("Id", headFont)); hcell.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(hcell); ``` 數據放置在表單元格內,由`PdfPCell`表示。 使用`setHorizontalAlignment()`方法將文本水平對齊。 ```java document.add(table); ``` 最后,表格被插入到 PDF 文檔中。 `MyController.java` ```java package com.zetcode.controller; import com.zetcode.bean.Car; import com.zetcode.service.ICarService; import com.zetcode.view.MyPdfView; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @Controller public class MyController { @Autowired private ICarService carService; @RequestMapping(path = "/report", method = RequestMethod.GET) public ModelAndView report() { Map<String, Object> model = new HashMap<>(); List<Car> cars = carService.findAll(); model.put("cars", cars); return new ModelAndView(new MyPdfView(), model); } } ``` 在`MyController`中,我們有一個映射。 ```java @Autowired private ICarService carService; ``` 我們將`CarService`對象注入到屬性中。 服務對象用于從數據庫檢索數據。 ```java @RequestMapping(path = "/report", method = RequestMethod.GET) public ModelAndView report() { Map<String, Object> model = new HashMap<>(); List<Car> cars = carService.findAll(); model.put("cars", cars); return new ModelAndView(new MyPdfView(), model); } ``` 在`report()`方法中,我們使用`findAll()`方法找到所有汽車。 我們將自定義`MyPdfView`返回給客戶端。 `ICarService.java` ```java package com.zetcode.service; import com.zetcode.bean.Car; import java.util.List; public interface ICarService { public List<Car> findAll(); } ``` `ICarService`提供了一種從數據源獲取所有汽車的契約方法。 `CarService.java` ```java package com.zetcode.service; import com.zetcode.bean.Car; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; @Service public class CarService implements ICarService { @Autowired private JdbcTemplate jtm; @Override public List<Car> findAll() { String sql = "SELECT * FROM Cars"; List<Car> cars = jtm.query(sql, new BeanPropertyRowMapper(Car.class)); return cars; } } ``` `CarService`包含`findAll()`方法的實現。 我們借助`JdbcTemplate`從`Cars`表中檢索所有汽車。 ```java @Autowired private JdbcTemplate jtm; ``` 注入`JdbcTemplate`。 ```java String sql = "SELECT * FROM Cars"; ``` 這是要執行的 SQL。 我們從`Cars`表中選擇所有汽車。 ```java List<Car> cars = jtm.query(sql, new BeanPropertyRowMapper(Car.class)); ``` `BeanPropertyRowMapper`將一行轉換為指定映射目標類的新實例。 `index.html` ```java <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Home Page</title> </head> <body> <a href="/report.html">Generate report</a> </body> </html> ``` `index.html`文件包含一個生成 PDF 報告的鏈接。 靜態文件從預定義目錄提供; 其中之一是`static`,位于`src/main/resources`中。 `Application.java` ```java package com.zetcode; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` `Application`設置 Spring Boot 應用。 ```java $ mvn spring-boot:run ``` 我們啟動 Spring Boot 應用。 導航至`http://localhost:8080/`以測試應用。 H2 控制臺應用可從`http://localhost:8080/console/`獲得。 控制臺應用的 JDBC URL 為`jdbc:h2:mem:testdb`。 密碼為空。 在本教程中,我們從 H2 數據庫的數據庫表中使用 iText 創建了 PDF 報告。 該應用使用 Spring Boot 框架,并在 Web 環境中運行。 您可能也對這些相關教程感興趣: [Spring Boot H2 教程](/articles/springbooth2/), [Spring Boot JasperReports Web 集成](/articles/jasperspringbootweb/), [Spring Web 應用簡介](/articles/springwebfirst/), [Spring Boot 第一個 Web 應用](/articles/springbootwebfirst/)和 [Java 教程](/lang/java/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看