wiki.xsx.core.pdf.handler.XEasyPdfFontMapperHandler Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of x-easypdf Show documentation
Show all versions of x-easypdf Show documentation
A framework based on pdfbox
package wiki.xsx.core.pdf.handler;
import lombok.SneakyThrows;
import org.apache.fontbox.FontBoxFont;
import org.apache.fontbox.ttf.OpenTypeFont;
import org.apache.fontbox.ttf.TTFParser;
import org.apache.fontbox.ttf.TrueTypeFont;
import org.apache.pdfbox.pdmodel.font.*;
import wiki.xsx.core.pdf.doc.XEasyPdfDefaultFontStyle;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ConcurrentHashMap;
/**
* pdf字体映射助手
*
* @author xsx
* @date 2022/6/20
* @since 1.8
*
* Copyright (c) 2020-2022 xsx All Rights Reserved.
* x-easypdf is licensed under the Mulan PSL v1.
* You can use this software according to the terms and conditions of the Mulan PSL v1.
* You may obtain a copy of Mulan PSL v1 at:
* http://license.coscl.org.cn/MulanPSL
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR
* PURPOSE.
* See the Mulan PSL v1 for more details.
*
*/
public class XEasyPdfFontMapperHandler implements FontMapper {
/**
* 字体名称映射字典
*/
private static final ConcurrentHashMap FONT_NAME_MAPPING = new ConcurrentHashMap<>(16);
/**
* 字体路径映射字典
*/
private static final ConcurrentHashMap FONT_PATH_MAPPING = new ConcurrentHashMap<>(16);
/**
* 字体映射助手实例
*/
private static final XEasyPdfFontMapperHandler INSTANCE = new XEasyPdfFontMapperHandler();
/**
* 有参构造
*/
private XEasyPdfFontMapperHandler() {
// 初始化
this.init(XEasyPdfDefaultFontStyle.LIGHT, XEasyPdfDefaultFontStyle.NORMAL, XEasyPdfDefaultFontStyle.BOLD);
// 设置字体映射
FontMappers.set(this);
}
/**
* 获取字体映射实例
*
* @return 返回字体映射实例
*/
public static XEasyPdfFontMapperHandler getInstance() {
return INSTANCE;
}
/**
* 添加字体
*
* @param fontPath 字体路径
* @param font 字体
*/
@SneakyThrows
public void addFont(String fontPath, FontBoxFont font) {
FONT_NAME_MAPPING.putIfAbsent(font.getName(), font);
FONT_PATH_MAPPING.putIfAbsent(fontPath, font);
}
/**
* 根据字体路径获取字体
*
* @param fontPath 字体路径
* @return 返回字体
*/
@SneakyThrows
public FontBoxFont getFontByPath(String fontPath) {
return FONT_PATH_MAPPING.get(fontPath);
}
/**
* 获取ttf字体
*
* @param baseFont 字体名称
* @param fontDescriptor 字体描述
* @return 返回ttf字体
*/
@Override
public FontMapping getTrueTypeFont(String baseFont, PDFontDescriptor fontDescriptor) {
// 查找字体
TrueTypeFont ttf = (TrueTypeFont) this.findFont(baseFont);
// 如果字体不为空,则返回字体
if (ttf != null) {
// 返回字体
return new FontMapping<>(ttf, false);
}
// 返回空
return null;
}
/**
* 获取字体
*
* @param baseFont 字体名称
* @param fontDescriptor 字体描述
* @return 返回字体
*/
@Override
public FontMapping getFontBoxFont(String baseFont, PDFontDescriptor fontDescriptor) {
// 查找字体
FontBoxFont font = this.findFont(baseFont);
// 如果字体不为空,则返回字体
if (font != null) {
// 返回字体
return new FontMapping<>(font, false);
}
// 返回空
return null;
}
/**
* 获取字体CID信息
*
* @param baseFont 字体名称
* @param fontDescriptor 字体描述
* @param cidSystemInfo CID系统信息
* @return 返回字体CID信息
*/
@Override
public CIDFontMapping getCIDFont(String baseFont, PDFontDescriptor fontDescriptor, PDCIDSystemInfo cidSystemInfo) {
// 查找字体
FontBoxFont font = this.findFont(baseFont);
// 如果字体为otf类型,则返回otf类型信息
if (font instanceof OpenTypeFont) {
// 返回otf类型信息
return new CIDFontMapping((OpenTypeFont) font, null, false);
}
// 如果字体为ttf类型,则返回ttf类型信息
if (font instanceof TrueTypeFont) {
// 返回ttf类型信息
return new CIDFontMapping(null, font, false);
}
// 返回默认字体类型信息
return new CIDFontMapping(null, FONT_NAME_MAPPING.get(XEasyPdfDefaultFontStyle.NORMAL.getName()), false);
}
/**
* 初始化
*
* @param styles 字体样式
*/
private void init(XEasyPdfDefaultFontStyle... styles) {
// 遍历字体样式
for (XEasyPdfDefaultFontStyle style : styles) {
// 初始化输入流(从资源路径读取)
try (InputStream inputStream = new BufferedInputStream(XEasyPdfFontMapperHandler.class.getResourceAsStream(style.getPath()))) {
// 添加字体
addFont(style.getPath(), new TTFParser(true, true).parse(inputStream));
} catch (IOException e) {
// 提示异常信息
throw new RuntimeException(e);
}
}
}
/**
* 查找字体
*
* @param postScriptName 字体名称
* @return 返回字体
*/
private FontBoxFont findFont(String postScriptName) {
// 如果字体名称为空,则返回空
if (postScriptName == null) {
// 返回空
return null;
}
// 获取字体
FontBoxFont info = this.getFont(postScriptName);
// 如果字体不为空,则返回字体
if (info != null) {
// 返回字体
return info;
}
// 重新获取字体(替换字体名称,移除“-”)
info = this.getFont(postScriptName.replace("-", ""));
// 如果字体不为空,则返回字体
if (info != null) {
// 返回字体
return info;
}
// 重新获取字体(替换字体名称,替换“,”为“-”)
info = this.getFont(postScriptName.replace(',', '-'));
// 如果字体不为空,则返回字体
if (info != null) {
// 返回字体
return info;
}
// 重新获取字体(替换字体名称,添加“-Regular”)
return this.getFont(postScriptName + "-Regular");
}
/**
* 获取字体
*
* @param postScriptName 字体名称
* @return 返回字体
*/
private FontBoxFont getFont(String postScriptName) {
// 如果字体名称包含“+”,则截取子集名称
if (postScriptName.contains("+")) {
// 重置字体名称(截取子集名称)
postScriptName = postScriptName.substring(postScriptName.indexOf('+') + 1);
}
// 获取字体
return FONT_NAME_MAPPING.get(postScriptName);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy