Mengintegrasikan tabel PDF dengan sumber data di Java
Contents
[
Hide
]
Contoh Java ini membangun tabel PDF dari data CSV tanpa bergantung pada pustaka dataframe eksternal.
Membuat tabel dari baris CSV
Gunakan contoh ini ketika kolom CSV yang dipilih harus diubah menjadi tabel PDF yang bergaya.
- Buat sebuah
Tabledan konfigurasikan batasnya. - Deteksi indeks kolom yang diperlukan dari baris header CSV.
- Tambahkan baris header dan jumlah baris data yang diminta, kemudian kembalikan tabel.
public static Table createTableFromCsv(List<String[]> rows, int maxRows) {
Table table = new Table();
table.setBorder(new BorderInfo(BorderSide.All, 1, Color.getLightGray()));
table.setDefaultCellBorder(new BorderInfo(BorderSide.Bottom, 1, Color.getLightGray()));
String[] header = rows.get(0);
int[] selectedColumns = findColumns(header, "city", "country", "population", "iso3");
Row headerRow = table.getRows().add();
headerRow.setRowBroken(false);
for (int columnIndex : selectedColumns) {
Cell cell = headerRow.getCells().add(header[columnIndex]);
cell.setBackgroundColor(Color.getLightGray());
}
int limit = Math.min(maxRows, rows.size() - 1);
for (int rowIndex = 1; rowIndex <= limit; rowIndex++) {
Row row = table.getRows().add();
String[] rowData = rows.get(rowIndex);
for (int columnIndex : selectedColumns) {
row.getCells().add(columnIndex < rowData.length ? rowData[columnIndex] : "");
}
}
return table;
}
Membuat PDF dari data CSV
Gunakan contoh ini ketika input CSV harus diubah menjadi dokumen tabel PDF.
- Baca baris CSV dari file input.
- Pratinjau sebagian baris yang diurai di konsol.
- Buat PDF
Document, tambahkan tabel yang dihasilkan, dan simpan file output.
public static void createPdfFromCsv(Path inputFile, Path outputFile, int maxRows) throws Exception {
List<String[]> rows = readCsv(inputFile);
for (int i = 0; i < Math.min(20, rows.size()); i++) {
System.out.println(String.join(" | ", rows.get(i)));
}
try (Document document = new Document()) {
Page page = document.getPages().add();
page.getParagraphs().add(createTableFromCsv(rows, maxRows));
document.save(outputFile.toString());
}
}
Menemukan indeks kolom CSV berdasarkan nama
Gunakan pembantu ini ketika kolom bernama tertentu harus ditemukan dalam baris header CSV.
- Iterasikan melalui nama kolom yang diminta.
- Cari baris header untuk indeks yang cocok.
- Kembalikan posisi kolom yang dikumpulkan.
private static int[] findColumns(String[] header, String... names) {
int[] indexes = new int[names.length];
for (int i = 0; i < names.length; i++) {
indexes[i] = 0;
for (int j = 0; j < header.length; j++) {
if (names[i].equals(header[j])) {
indexes[i] = j;
break;
}
}
}
return indexes;
}
Membaca baris CSV dari file
Gunakan pembantu ini ketika sumber CSV harus dimuat ke memori sebelum pembuatan tabel.
- Baca semua baris dari file input.
- Pisahkan setiap baris dengan pembantu parser CSV.
- Kembalikan nilai baris yang dikumpulkan.
private static List<String[]> readCsv(Path inputFile) throws Exception {
List<String[]> rows = new ArrayList<>();
for (String line : Files.readAllLines(inputFile)) {
rows.add(splitCsvLine(line));
}
return rows;
}
Memisahkan satu baris CSV menjadi nilai
Gunakan pembantu ini ketika baris CSV mungkin berisi nilai yang diapit tanda kutip dan karakter kutip yang di-escape.
- Iterasikan karakter dalam baris.
- Lacak apakah parser saat ini berada di dalam teks yang diapit tanda kutip.
- Bangun daftar nilai akhir dan kembalikan sebagai array.
private static String[] splitCsvLine(String line) {
List<String> values = new ArrayList<>();
StringBuilder current = new StringBuilder();
boolean inQuotes = false;
for (int i = 0; i < line.length(); i++) {
char ch = line.charAt(i);
if (ch == '"') {
if (inQuotes && i + 1 < line.length() && line.charAt(i + 1) == '"') {
current.append('"');
i++;
} else {
inQuotes = !inQuotes;
}
} else if (ch == ',' && !inQuotes) {
values.add(current.toString());
current.setLength(0);
} else {
current.append(ch);
}
}
values.add(current.toString());
return values.toArray(String[]::new);
}