【发布时间】:2021-03-19 13:25:15
【问题描述】:
我正在使用java 中的com.itextpdf 库来生成和编辑PDF。
我面临一个有线问题:PDF 内容(日期)未在 PDF 中正确呈现/显示。
我最初创建了一个仅使用 itext 的 PDF 文件,后来在后期处理中 - 替换了 PDF 内容(日期)。
例如:日期 2020 年 11 月 28 日的渲染如下所示(每次运行的渲染略有变化 - 在公共或空格或数字级别):
我尝试过的事情:
- 从旧版本升级 itext:
5.5.6和最新版本:5.5.13.2。 - 尝试了多种字体。
- 编码风格:
UTF-8和ISO-8859-1,还是不行。
任何指针都会有所帮助。
//initial placeholder:
String TEMPORARY_DATE_PLACE_HOLDER = "----------------";
//BaseFont (tried with both embedded as true / false):
BaseFont.createFont("/arial.ttf", BaseFont.WINANSI, false);
-
-
-
// post processing: where the placeholder is replaced.
reader = new PdfReader(InputPDF);
PdfDictionary dict = reader.getPageN(1);
PdfObject object = dict.getDirectObject(PdfName.CONTENTS);
if (object instanceof PRStream) {
PRStream stream = (PRStream) object;
byte[] data = PdfReader.getStreamBytes(stream);
String CHARACTER_ENCODING_SET = "ISO-8859-1";
String dataString = new String(data, CHARACTER_ENCODING_SET);
if ( dateFormatList.contains(requiredDate)) {
dataString = dataString.replaceAll(TEMPORARY_DATE_PLACE_HOLDER, new SimpleDateFormat(dateFormat).format(requiredDate));
}
stream.setData(dataString.getBytes(CHARACTER_ENCODING_SET));
}
stamper = new PdfStamper(reader, out);
stamper.close();
reader.close();
byte[] fileContent = out.toByteArray();
helperToWrite(new ByteArrayInputStream(fileContent), "OutputPDF");
//Helper method to write into File:
private File helperToWrite(nputStream inputStream, String name){
try (OutputStream outputStream = new FileOutputStream(file)) {
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
} catch (Exception e) {
}
return file;
}
【问题讨论】:
-
你说你要替换日期。如果您以幼稚的方式执行此操作,即通过在内容流中进行搜索和替换,则会出现此类问题,例如参见 here。