在Java中使用OpenPDF生成PDF教程

时间:2020-01-09 10:35:27  来源:igfitidea点击:

如果我们必须使用Java程序生成PDF,则想到的第一个选择就是iText。尽管使用iText的Java中的PDF是最好的选择之一,但是却有一个小问题。尽管iText是开源的,但它使用AGPL许可证,这意味着我们需要在同一AGPL许可证下免费共享整个应用程序。如果这对我们来说是个问题,那么另一种选择是使用OpenPDF在Java中生成PDF。

PDFBox是用于用Java生成PDF的另一个选项。有关使用PDFBox的示例,请查看本文。使用PDFBox教程在Java中生成PDF。

OpenPDF许可

OpenPDF是具有LGPL和MPL许可证的开源软件。需要注意的一点是,OpenPDF是iText版本4的分支。从iText版本5.0开始,开发人员已转向AGPL以提高其销售商业许可证的能力。

OpenPDF的Maven依赖

OpenPDF的最新版本是1.2.17版,我们需要添加以下依赖性以获得最新的OpenPDF版本。

<dependency>
  <groupId>com.github.librepdf</groupId>
  <artifactId>openpdf</artifactId>
  <version>1.2.17</version>
</dependency>

使用Java和OpenPDF的HelloWorld PDF

我们将首先创建一个简单的HelloWorld PDF,它还会显示内容的字体和文本颜色设置。使用OpenPDF创建PDF包含以下步骤。

  • 创建一个Document实例。

  • 获取包装文档并将PDF流定向到文件的PDFWriter实例。

  • 打开文件

  • 在文档中添加内容(段落)

  • 关闭文件

import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

public class HelloWorldPDF {
  public static final String CREATED_PDF = "F://theitroad//result//OpenPDF//HelloWorld.pdf";
  public static void main(String[] args) {
    Document document = new Document();
    try {
      PdfWriter.getInstance(document,new FileOutputStream(CREATED_PDF));
      document.open();
      // font and color settings
      Font font = new Font(Font.TIMES_ROMAN, 18, Font.NORMAL, Color.MAGENTA);
      Paragraph para = new Paragraph("Hello World PDF created using OpenPDF", font);
      document.add(para);     
    } catch (DocumentException | IOException de) {
      System.err.println(de.getMessage());
    }
    document.close();
  }
}

使用OpenPDF将文本文件转换为PDF

在Java示例中,有一个文本文件(Test.txt),可使用OpenPDF转换为PDF。

import java.awt.Color;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

public class HelloWorldPDF {
  public static final String SOURCE_FILE = "F://theitroad//result//Test.txt";
  public static final String CREATED_PDF = "F://theitroad//result//OpenPDF//Content.pdf";
  public static void main(String[] args) {
    Document document = new Document();
    try {
      BufferedReader br = new BufferedReader(new FileReader(SOURCE_FILE));
      PdfWriter.getInstance(document,new FileOutputStream(CREATED_PDF));
      document.open();
      // font and color settings
      Font font = new Font(Font.COURIER, 15, Font.NORMAL, Color.BLUE);
      String line;
      while ((line = br.readLine()) != null) {
        document.add(new Paragraph(line, font));
      }
      br.close();
    } catch (DocumentException | IOException de) {
      System.err.println(de.getMessage());
    }
    document.close();
  }
}

使用OpenPDF和表格的PDF

在此示例中,我们将使用Bean类Employee,雇员列表在使用Java程序的PDF表格中显示。

public class Employee {
  private String name;
  private String dept;
  private int salary;
	
  Employee(String name, String dept, int salary){
    this.name = name;
    this.dept = dept;
    this.salary = salary;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getSalary() {
    return salary;
  }
  public void setSalary(int salary) {
    this.salary = salary;
  }
  public String getDept() {
    return dept;
  }
  public void setDept(String dept) {
    this.dept = dept;
  }
}
import java.awt.Color;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Phrase;
import com.lowagie.text.Table;
import com.lowagie.text.alignment.HorizontalAlignment;
import com.lowagie.text.alignment.VerticalAlignment;
import com.lowagie.text.pdf.PdfWriter;

public class PDFWithTable {
  public static final String CREATED_PDF = "F://theitroad//result//OpenPDF//PDFWithTable.pdf";
  public static void main(String[] args) {
  Document document = null;			
    try {
      document = new Document();
      PdfWriter.getInstance(document,new FileOutputStream(CREATED_PDF));
      Font font = new Font(Font.HELVETICA, 12, Font.BOLD);
      Table table = new Table(3); 
      table.setPadding(5);
      table.setSpacing(1);
      table.setWidth(100);
      // Setting table headers
      Cell cell = new Cell("Employee Information");
      cell.setHeader(true);
      cell.setVerticalAlignment(VerticalAlignment.CENTER);
      cell.setHorizontalAlignment(HorizontalAlignment.CENTER);
      cell.setColspan(3);
      cell.setBackgroundColor(Color.LIGHT_GRAY);
      table.addCell(cell);

      table.addCell(new Phrase("Name", font));
      table.addCell(new Phrase("Dept", font));          
      table.addCell(new Phrase("Salary", font));
      table.endHeaders();
      // Employee information to table cells
      List<Employee> employees = getEmployees();
      for(Employee emp : employees) {
        table.addCell(emp.getName());
        table.addCell(emp.getDept());
        table.addCell(Integer.toString(emp.getSalary()));
      }
      document.open();
      document.add(table);
      document.close();
    } catch (DocumentException | FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
	
  // create a list of employees
  private static List<Employee> getEmployees() {
    List<Employee> employees = new ArrayList<>();
    employees.add(new Employee("Hyman", "HR", 12000));
    employees.add(new Employee("Liza", "IT", 5000));
    employees.add(new Employee("Jeremy", "Finance", 9000));
    employees.add(new Employee("Frederick", "Accounts", 8000));
    return employees;
  }
}

使用OpenPDF将图像添加到PDF

将图像添加到存储在图像文件夹中的PDF。

import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;
public class ImagePDF {
  public static final String CREATED_PDF = "F://theitroad//result//OpenPDF//Image.pdf";
  public static void main(String[] args) {
  Document document = new Document();
  try {
    PdfWriter.getInstance(document, new FileOutputStream(CREATED_PDF));
    Font font = new Font(Font.HELVETICA, 12, Font.NORMAL, Color.RED);
		// Image instance
    Image image = Image.getInstance("images//Image OpenPDF.png");
    document.open();
    document.add(new Paragraph("In this PDF which is created using OpenPDF an image is added", font));
    document.add(image);
    document.close();    
  } catch (DocumentException | IOException de) {
    System.err.println(de.getMessage());
  }
  document.close();
  }
}

使用OpenPDF在Web应用程序中渲染PDF

为了使用OpenODF将PDF呈现给浏览器,需要使用ServletOutputStream作为PDFWriter的参数。我们可以从HTTPResponse获取此OutputStream。

try{
 response.setContentType("application/pdf");
 Document doc = new Document();
 PdfWriter.getInstance(doc, response.getOutputStream());
 //Font settings
 Font font = new Font(Font.TIMES_ROMAN, 15, Font.BOLD, Color.BLUE);
 doc.open();
 Paragraph para = new Paragraph("This PDF is rendered as a web response using OpenODF.", font);
 doc.add(para);
 doc.close();
}catch(Exception e){
  e.printStackTrace();
}

使用OpenPDF将列表添加到PDF

如果我们想将列表项添加到PDF中,可以使用

  • 创建列表项的ListItem类。

  • List类可创建一个保存列表项的List。

在List类中,可以使用一些常量(例如ORDERED,NUMERICAL,ALPHABETICAL)对列表项进行编号。
我们还可以使用setListSymbol()方法为列表项设置符号。
还有专门的类RomanList和GreekList,它们扩展了List类并分别支持罗马字母和希腊字母。

import java.io.FileOutputStream;
import java.io.IOException;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.List;
import com.lowagie.text.ListItem;
import com.lowagie.text.Paragraph;
import com.lowagie.text.RomanList;
import com.lowagie.text.pdf.PdfWriter;

public class ListItems {
  public static final String CREATED_PDF = "F://theitroad//result//OpenPDF//List.pdf";
  public static void main(String[] args) {
  Document document = new Document();
  try {
    PdfWriter.getInstance(document, new FileOutputStream(CREATED_PDF));
    document.open();
    document.add(new Paragraph("List with Numbers"));	
    List list = new List(List.ORDERED);
    list.setIndentationLeft(15);
    list.add(new ListItem("Item1"));
    list.add(new ListItem("Item2"));
    list.add(new ListItem("Item3"));
    document.add(list);
		    
    document.add(new Paragraph("List with Alphabets Uppercase"));		    
    list = new List(false, List.ALPHABETICAL);
    list.setIndentationLeft(15);
    list.add(new ListItem("Item1"));
    list.add(new ListItem("Item2"));
    list.add(new ListItem("Item3"));
    document.add(list);
		    
    document.add(new Paragraph("List with Roman Numerals"));
    List romanList = new RomanList(List.UPPERCASE, 14);
    // Add ListItem objects
    romanList.add(new ListItem("Item1"));
    romanList.add(new ListItem("Item2"));
    romanList.add(new ListItem("Item3"));
    document.add(romanList);
		    
    document.add(new Paragraph("List with Nested List"));		    
    list = new List(false, List.ALPHABETICAL);
    list.setIndentationLeft(15);
    list.add(new ListItem("Item1"));
    // Nested List
    List nestedList = new List();
    nestedList.setIndentationLeft(20);
    nestedList.setListSymbol("\u2022");
    nestedList.add(new ListItem("Item2"));
    nestedList.add(new ListItem("Item3"));
    list.add(nestedList);
    list.add(new ListItem("Item4"));
    document.add(list);
    document.close();
  } catch (DocumentException | IOException de) {
    System.err.println(de.getMessage());
  }
  document.close();
  }
}