gpt4 book ai didi

pdfbox - 了解 PDFBox 2.0 中字体的加载

转载 作者:行者123 更新时间:2023-12-02 06:30:07 27 4
gpt4 key购买 nike

我终于成功地让 PDFBox 打印我的 unicodes。但现在,我想了解我提出的解决方案。下面的代码可以运行并将 打印到页面上。

有两件事不起作用:

  • 改变PDType0Font.load(documentMock, systemResourceAsStream, true);PDType0Font.load(documentMock, systemResourceAsStream, false);

  • 改变最终 PDFont robotoLight = loadFontAlternative("Roboto-Light.ttf");最终 PDFont robotsLight = loadFont("Roboto-Light.ttf");

第一个更改打印两个点而不是字符。embedSubset 会做什么,因为它在设置为 false 时不起作用?文档太稀疏,我无法理解。

第二个更改给出以下异常线程“main”java.lang.IllegalArgumentException中的异常:U+2265在此字体的编码中不可用:WinAnsiEncoding这个问题已经在 PDFBox 2.0 之前的许多其他问题中讨论过,其中在处理 unicode 时存在错误。因此,他们不会直接回答这个问题。除此之外,问题很清楚:我不应该将编码设置为 WinAnsiEncoding,而应该设置不同的编码。但是编码应该是什么?以及为什么没有 UTF-8 编码或类似的可用编码?COSName 中没有关于许多选项的文档。

public class SimpleReportUnicode {
public static void main(String[] args) throws IOException {
PDDocument report = createReport();
final String fileLocation = "c:/SimpleFormUnicode.pdf";
report.save(fileLocation);
report.close();
}

private static PDDocument createReport() throws IOException {
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);

PDPageContentStream contentStream = new PDPageContentStream(document, page);
final PDFont robotoLight = loadFontAlternative("Roboto-Light.ttf");
writeText(contentStream, robotoLight, 100, 650);

contentStream.close();
return document;
}

private static void writeText(PDPageContentStream contentStream, PDFont font, double x, double y) {
try {
contentStream.beginText();
contentStream.setFont(font, 12);
contentStream.moveTextPositionByAmount((float) x, (float) y);
String unicode = "≥";
contentStream.showText(unicode);
contentStream.endText();
}
catch (IOException e) {
}
}

private static PDFont loadFont(String location) {
PDFont font;
try {
PDDocument documentMock = new PDDocument();
InputStream systemResourceAsStream = ClassLoader.getSystemResourceAsStream(location);
Encoding encoding = Encoding.getInstance(COSName.WIN_ANSI_ENCODING);
font = PDTrueTypeFont.load(documentMock, systemResourceAsStream, encoding);
}
catch (IOException e) {
throw new RuntimeException("IO exception");
}
return font;
}

private static PDFont loadFontAlternative(String location) {
PDDocument documentMock = new PDDocument();
InputStream systemResourceAsStream = ClassLoader.getSystemResourceAsStream(location);
PDFont font;
try {
font = PDType0Font.load(documentMock, systemResourceAsStream, true);
}
catch (IOException e) {
throw new RuntimeException("IO exception");
}
return font;
}
}

编辑如果您想使用与代码中相同的字体,可以在此处使用 Roboto: https://fonts.google.com/specimen/Roboto将 Roboto-Light.ttf 添加到您的类路径中,代码应该可以开箱即用。

最佳答案

正如评论中所讨论的:

  • 使用版本 2.0.7 后,embedSubsets 的问题就消失了。 (顺便说一句,2.0.8 今天发布了);
  • 问题“U+2265 在此字体的编码中不可用:WinAnsiEncoding”在 FAQ 中进行了解释。解决方案是使用您已在工作版本中执行的 PDType0Font.load()
  • 字体没有 UTF-8 编码,因为它在 PDF 规范中不可用;
  • 使用 embedSubsets true 会生成一个 4KB 文件,如果使用 false,则文件大小为 100KB,因为嵌入了完整字体,因此 false 通常是最好的。

关于pdfbox - 了解 PDFBox 2.0 中字体的加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47092183/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com