当前位置: 首页 > 知识库问答 >
问题:

pdfbox:提取字体中的U+0050没有字形

凤修筠
2023-03-14

我试图在文档中创建新的页面并写入一些文本,同时使用文件中包含的字体。

字体是从资源中提取的:

PDPage page = document.getPage(0);
PDResources res = page.getResources();

List<PDFont> fonts = new ArrayList<>();

for (COSName fontName : res.getFontNames()) {
     PDFont font = res.getFont(fontName);
     System.out.println(font);
     fonts.add(font);
}

后来用来写一些文字:

stream.beginText();
stream.setFont(fonts.get(0), 12);
stream.setTextMatrix(Matrix.getTranslateInstance(20, 50));
stream.showText("Protokol");
stream.endText();

包括PDF在内的完整项目可在github存储库中获得,该存储库显示了该问题

共有1个答案

曹涵润
2023-03-14

在这里,您实际上遇到了一个打开的PDFBox TODO,您的stream.showtext最终调用每个字符的基础CID字体的encode,这里我们有:

public class PDCIDFontType2 extends PDCIDFont
{
    ...
    public byte[] encode(int unicode)
    {
        int cid = -1;
        if (isEmbedded)
        {
            ...
            // otherwise we require an explicit ToUnicode CMap
            if (cid == -1)
            {
                //TODO: invert the ToUnicode CMap?
                // see also PDFBOX-4233
                cid = 0;
            }
        }
        ...
        if (cid == 0)
        {
            throw new IllegalArgumentException(
                    String.format("No glyph for U+%04X (%c) in font %s", unicode, (char) unicode, getName()));
        }

        return encodeGlyphId(cid);
    }
    ...
}

(org.apache.pdfbox.pdmodel.font.pdcidfonttype2)

如果PDFBox无法确定从Unicode到glyph代码的映射(if(cid==-1)),JavaDoc注释指出了确定glyph代码的另一种方法,即反向查找ToUnicode映射。如果实现了这一点,PDFBox可能已经确定了一个字形ID并写入了您的文本。

 类似资料:
  • PDFBox的字体类PDFont中有一个名为getFontHeight的方法,听起来很简单。然而,我不太理解文档和参数代表什么。 这将获得字符的字体宽度。 参数: c-要获取宽度的字符代码。 偏移量-数组中的偏移量。长度 数据的长度。 返回:宽度为1000个文本空间单位,即333或777 在PDFBox中,这个方法是用来获取角色高度的正确方法吗?如果是的话,如何获取?字体高度和字体大小之间是否存在

  • 嗨,这个问题是指之前的帖子: 有人能给我举个例子,说明如何使用PDFBox提取“单词”的坐标吗 我使用的是PDFBOX 2.0.10 我已成功编译了组合代码,但在尝试运行示例时出现异常错误。 提供的解决方案没有标准的主方法,这是我感到困惑的地方。 有人能告诉我怎样才能成功运行组合代码吗。 堆栈跟踪 可以在这里找到坐标https://github.com/mkl-public/testarea-pd

  • 试图通过遍历查看以下PDF文件中的所有字段,但它是“空的”。但如果我保存到一个新文件: 田地是否“隐蔽”?有办法得到他们吗?(我的最终目标是自动填写其中的一些内容)

  • 2013年7月17日1:05:28 PM org.apache.pdfbox.util.pdfstreamengine processOperator信息:不支持/禁用操作:BDC 2013年7月17日1:05:29 PM org.apache.pdfbox.util.pdfstreamengine processOperator信息:不支持/禁用操作:EMC DeviceGray org.apa

  • 我想写一些文本到一个PDF。我在“ICRResultTXT”中有数据。在尝试写入PDF之前,我还将数据写入text.txt文件。当我试图写到pdf时,我得到“没有字形的U+000A在Helvetica-Bold字体”。如何解决?我不喜欢“Helvetica-Bold”。我愿意改成任何字体。

  • 我正在使用最新的PDFBOX库来提取文本,为了做到这一点,我编写了我的自定义PDFStreamEngine(shwoing部分代码,但其余应该类似): 然而,我有三个问题:第一个:“Tf”操作符-在PDF/F1中1 Tf:当我显示fontName和size时,它显示:evmanj+myriadpro-regular,size 1;但是,illustrator和adobe Acrobat上的实际字体