Мне нужно преобразовать простой текстовый файл, в котором форматирование выполнялось с использованием «заготовок» (старых файлов мэйнфреймов), в формат PDF.Я использую библиотеку iText 7 и Java 1.8.В целом это работает, но форматирование с использованием пробелов не отображается в результирующем PDF, поэтому отступы не отображаются в PDF.
Я использую шрифт COURIER, поэтому размеры пробелов должны соответствовать размеру символа.
Вот код Java, который я использую:
import com.itextpdf.io.font.FontConstants;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.test.annotations.WrapToTest;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
@WrapToTest
public class Text2Pdf {
// public static final String DEST = "results/text2pdf.pdf";
public static void main(String[] args) throws IOException {
// Check for the mandatory 1st argument -> Source File
if (args.length != 1) {
System.out.println("\nUsage:");
System.out.println("Text2Pdf AbsolutePath2TextFile");
System.out.println("\nExample:");
System.out.println("Text2Pdf C:\\Users\\USER1\\Desktop\\HelloWorld.txt");
System.out.println(
"\nResulting .pdf file (HelloWorld.pdf) will be written to Text2PdfResults directory in the current working directory.");
System.exit(1);
}
// Check if given Source File exist ...
File sourceFile = new File(args[0]);
// Get the Source and Destination File Name
String sourceFileName = sourceFile.getName();
String destFileName = sourceFileName + ".pdf";
String destFileNameDir = "Text2PdfResults/" + destFileName;
if (!sourceFile.exists()) {
System.out.println("\nERROR:");
System.out.println("Given source text file " + sourceFile.getAbsolutePath() + " doesn't exist!");
System.exit(2);
}
File destFile = new File(destFileNameDir);
destFile.getParentFile().mkdirs();
new Text2Pdf().createPdf(sourceFile, destFileNameDir);
}
public void createPdf(File sourceFile, String dest) throws IOException {
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
Document document = new Document(pdf);
document.setTextAlignment(TextAlignment.LEFT);
document.setFontSize((float) 8.0);
document.setLeftMargin((float) 40.0);
document.setRightMargin((float) 40.0);
//BufferedReader br = new BufferedReader(new FileReader(sourceFile));
BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream(sourceFile), "UTF8"));
String line;
PdfFont normal = PdfFontFactory.createFont(FontConstants.COURIER);
while ((line = br.readLine()) != null) {
document.add(new Paragraph(line).setFont(normal));
}
document.close();
br.close();
}
Вот текстовый файл, который я хочу преобразовать:
Test Customer 28.06.2019
12345678901234567890123456789012345678901234567890123456789012345678901234567890
10 20 30 40 50 60 70 79
This section starts with 10 blanks right alignment
---------1. Test Nr. 1
2. Test Nr. 2
--------------------
Section starts with 5 blanks ...
This is the last line.
Полученный результат выглядиткак:
Test Customer 28.06.2019
12345678901234567890123456789012345678901234567890123456789012345678901234567890
10 20 30 40 50 60 70 79
This section starts with 10 blanks right alignment
---------1. Test Nr. 1
2. Test Nr. 2
--------------------
Section starts with 5 blanks ...
This is the last line.
Может кто-нибудь помочь понять, почему пробелы не отображаются в результирующем PDF?
С уважением,
Ральф
Привет, мкл
Спасибо за ответ.Я добавил следующий код, и он выглядит намного лучше в отношении пробелов: -)
while ((line = br.readLine()) != null) {
line = line.replace("\u0020", "\u00A0");
document.add(new Paragraph(line).setFont(normal));
}
Единственная проблема, которую я имею, это CR после каждой строки.У вас есть идея, почему после каждой строки есть дополнительная строка?
С уважением,
Ralf
ОБНОВЛЕНИЕ
Я добавил System.out.println(line);
перед тем, как код document.add и полученный результат не показывают никакой дополнительной строки:
Test Customer 28.06.2019
12345678901234567890123456789012345678901234567890123456789012345678901234567890
10 20 30 40 50 60 70 79
This section starts with 10 blanks right alignment
---------1. Test Nr. 1
2. Test Nr. 2
--------------------
Section starts with 5 blanks ...
This is the last line.
Примечание: если я использую System.out.print(line);
, я получаю только одну строку - нет \ n.
Кажется, что iText document.add будет генерировать эти дополнительные строки !! ??
С уважением,
Ralf