FileOutputStream outputStream=null; try{ outputStream=new FileOutputStream(saveFilePath); PdfWriter writer = new PdfWriter(saveFilePath); PdfDocument pdfDoc = new PdfDocument(writer); pdfDoc.setDefaultPageSize(PageSize.A4); ConverterProperties converterProperties = new ConverterProperties(); FontProvider provider = new FontProvider(); provider.addStandardPdfFonts(); provider.addSystemFonts(); byte[] fontBytes = Files.readAllBytes(Paths.get("D:/home/file/static/fonts/SourceHanSansSC-Regular.otf")); PdfFont pdfFont = PdfFontFactory.createFont(fontBytes, PdfEncodings.IDENTITY_H, true); pdfDoc.addFont(pdfFont); converterProperties.setFontProvider(provider); converterProperties.setCharset("UTF-8"); pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new PDFBuilder(pdfFont,title,pdfTime,footLabel)); Document doc = HtmlConverter.convertToDocument(htmlData, pdfDoc, converterProperties); doc.close(); writer.close(); outputStream.close(); }catch(Exception ex){ throw new PDFException("PDF export to File fail",ex); }finally{ IOUtils.closeQuietly(outputStream); }字体文件有中文斜体字形,但是生成pdf时中文斜体样式没有效果,该怎么改
时间: 2024-02-14 14:08:09 浏览: 24
你可以在FontProvider中添加你的字体文件,然后在ConverterProperties中设置字体属性,例如:
```
FontProvider fontProvider = new FontProvider();
fontProvider.addFont("D:/home/file/static/fonts/SourceHanSansSC-Regular.otf");
ConverterProperties converterProperties = new ConverterProperties();
converterProperties.setFontProvider(fontProvider);
```
另外,你可以尝试在创建PdfFont对象时,将isEmbedded参数设置为false,例如:
```
PdfFont pdfFont = PdfFontFactory.createFont(fontBytes, PdfEncodings.IDENTITY_H, false);
```
这样可以让iText不对字体进行嵌入,以避免字体文件中缺少斜体字形的问题。
相关问题
OutputStream outputStream = null; try { outputStream = new FileOutputStream(file,true); workbook.write(outputStream); } finally { FileKit.closeOutStream(outputStream); } OutputStream outputStream = null; try { outputStream = new FileOutputStream(file,true); workbook.write(outputStream); } finally { FileKit.closeOutStream(outputStream); }该代码往excle中追加数据导致excle打不开
这段代码看起来并没有明显的问题,但是在使用时可能会出现一些问题。其中最常见的问题是,在写入数据后没有调用 `outputStream.close()` 方法,导致文件句柄没有得到释放。这会导致 Excel 文件无法被其他程序打开或者编辑。
另外一种可能的原因是,当你向一个已经存在的 Excel 文件中追加数据时,需要使用特殊的方式打开文件,防止文件结构被破坏。你可以使用 `XSSFWorkbook` 的构造函数来打开文件,而不是 `new FileInputStream()`。例如:
```
File file = new File("example.xlsx");
XSSFWorkbook workbook = null;
try {
if (file.exists()) {
workbook = new XSSFWorkbook(new FileInputStream(file));
} else {
workbook = new XSSFWorkbook();
}
// do something with the workbook
} catch (IOException e) {
e.printStackTrace();
} finally {
if (workbook != null) {
workbook.close();
}
}
```
这段代码会检查文件是否存在,如果存在则使用 `XSSFWorkbook` 打开,否则会创建一个新的空白 Excel 文件。在写入数据时,你可以使用 `FileOutputStream` 的构造函数指定追加模式,例如:
```
OutputStream outputStream = new FileOutputStream(file, true);
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
```
这样就可以向 Excel 文件中追加数据,并且不会破坏文件结构。
FileOutputStream outputStream=null; try{ outputStream=new FileOutputStream(saveFilePath); PdfWriter writer = new PdfWriter(saveFilePath); PdfDocument pdfDoc = new PdfDocument(writer); pdfDoc.setDefaultPageSize(PageSize.A4); ConverterProperties converterProperties = new ConverterProperties(); FontProvider provider = new FontProvider(); provider.addFont("D:/home/file/static/fonts/SourceHanSansSC-Regular.otf"); provider.addStandardPdfFonts(); byte[] fontBytes = Files.readAllBytes(Paths.get("D:/home/file/static/fonts/SourceHanSansSC-Regular.otf")); PdfFont pdfFont = PdfFontFactory.createFont(fontBytes, PdfEncodings.IDENTITY_H, false); pdfDoc.addFont(pdfFont); converterProperties.setFontProvider(provider); converterProperties.setCharset("UTF-8"); pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new PDFBuilder(pdfFont,title,pdfTime,footLabel)); Document doc = HtmlConverter.convertToDocument(htmlData, pdfDoc, converterProperties); doc.close(); writer.close(); outputStream.close(); }catch(Exception ex){ throw new PDFException("PDF export to File fail",ex); }finally{ IOUtils.closeQuietly(outputStream); } 字体文件是思源黑体,生成pdf时,html有em标签的斜体样式,但是生成的pdf中文斜体样式没有了,怎么改
首先,要在`FontProvider`中添加思源黑体的斜体字体。在思源黑体字体文件所在的文件夹中,有一个名为SourceHanSansSC-Bold.otf的文件,它是思源黑体的粗体字体。我们可以在`FontProvider`中添加这个粗体字体,然后通过设置CSS样式的方式来实现斜体。
以下是修改后的代码示例:
```java
FileOutputStream outputStream=null;
try{
outputStream=new FileOutputStream(saveFilePath);
PdfWriter writer = new PdfWriter(saveFilePath);
PdfDocument pdfDoc = new PdfDocument(writer);
pdfDoc.setDefaultPageSize(PageSize.A4);
ConverterProperties converterProperties = new ConverterProperties();
FontProvider provider = new FontProvider();
provider.addFont("D:/home/file/static/fonts/SourceHanSansSC-Regular.otf");//添加思源黑体常规字体
provider.addFont("D:/home/file/static/fonts/SourceHanSansSC-Bold.otf");//添加思源黑体粗体字体
provider.addStandardPdfFonts();
byte[] fontBytes = Files.readAllBytes(Paths.get("D:/home/file/static/fonts/SourceHanSansSC-Regular.otf"));
PdfFont pdfFont = PdfFontFactory.createFont(fontBytes, PdfEncodings.IDENTITY_H, false);
pdfDoc.addFont(pdfFont);
converterProperties.setFontProvider(provider);
converterProperties.setCharset("UTF-8");
pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new PDFBuilder(pdfFont,title,pdfTime,footLabel));
//设置CSS样式,实现中文斜体
ConverterProperties cssProperties = new ConverterProperties();
CssAppliers cssAppliers = new DefaultCssAppliers();
cssAppliers.setItalic(new Chunk("", pdfFont).setItalic());
cssProperties.setCssAppliers(cssAppliers);
cssProperties.setFontProvider(provider);
Document doc = HtmlConverter.convertToDocument(htmlData, pdfDoc, cssProperties);
doc.close();
writer.close();
outputStream.close();
}catch(Exception ex){
throw new PDFException("PDF export to File fail",ex);
}finally{
IOUtils.closeQuietly(outputStream);
}
```
需要注意的是,在设置CSS样式时,我们通过`Chunk`类的`setItalic()`方法来实现斜体。