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

使用pdfbox-如何从cosname中获得字体?

仲孙鸿畴
2023-03-14
COSDictionary dict = new COSDictionary();
dict.add(fontname, something); // fontname COSName from below code
PDFontFactory.createFont(dict);

如果你需要更多的背景,我在下面补充了整个故事:

我试图替换PDF中的一些字符串。这将成功(只要所有文本都存储在一个令牌中)。为了保持格式,我喜欢重新居中的文本。据我所知,我可以通过得到新旧字符串的宽度,做一些琐碎的计算,并设置新的位置来做到这一点。

我在stackoverflow上找到了一些灵感,用来替换https://stackoverflow.com/a/36404377(是的,它有一些问题,但适用于我简单的PDF格式。以及如何使用PDFBox将文本居中。不幸的是,这个示例使用了字体常量。

  PDFStreamParser parser = new PDFStreamParser(page);
  parser.parse();
  java.util.List<Object> tokens = parser.getTokens();
  for (int j = 0; j < tokens.size(); j++)
  {
    Object next = tokens.get(j);
    if (next instanceof Operator)
    {
      Operator op = (Operator) next;
      // Tj and TJ are the two operators that display strings in a PDF
      if (op.getName().equals("Tj"))
      {
        // Tj takes one operator and that is the string to display so lets
        // update that operator
        COSString previous = (COSString) tokens.get(j - 1);
        String string = previous.getString();
        String replaced = prh.getReplacement(string);
        if (!string.equals(replaced))
        { // if changes are there, replace the content
          previous.setValue(replaced.getBytes());
          float xpos = getPosX(tokens, j);
          //if (true) // center the text
          if (6 * xpos > page.getMediaBox().getWidth()) // check if text starts right from 1/xth page width
          {
            float fontsize = getFontSize(tokens, j);
            COSName fontname = getFontName(tokens, j);
            // TODO
            PDFont font = ?getFont?(fontname);
            // TODO
            float widthnew = getStringWidth(replaced, font, fontsize);
            setPosX(tokens, j, page.getMediaBox().getWidth() / 2F - (widthnew / 2F));
          }
          replaceCount++;
        }
      }

考虑到TODO标记之间的代码,我将从标记列表中获得所需的值。(是的,这段代码很糟糕,但现在让我集中讨论主要问题)

有了字符串、大小和字体,我就可以调用getWidth(..)方法。

不幸的是,我在从COSName变量创建字体时遇到了麻烦。

PDFont没有提供按名称创建字体的方法。PDFontFactory看起来很好,但需要一个cosdictionary。这是我放弃的点,请求你的帮助。

共有1个答案

钱毅
2023-03-14

名称与页面资源中的字体对象相关联。

假设您使用PDFBox 2.0.x,并且页面pdpage实例,您可以使用以下方法解析名称fontname

PDFont font = page.getResources().getFont(fontname);

但是对您所提到的问题的评论中仍然存在警告:这种方法只适用于非常简单的PDF,甚至可能损害其他PDF。

 类似资料:
  • 问题内容: 我正在尝试使用pdfbox从pdf中提取包含所有信息的文本。我获得了我想要的所有信息,除了颜色。我尝试了多种获取fontcolor的方法(包括使用PDFBox获取文本颜色)。但是没有用。现在,我从pdfBox的PageDrawer类复制了代码。但是,RGB值也不正确。 我正在使用上面的代码。得到的值是r = 0,g = 0,b = 0,内部cosp对象值为[0.0],内部pd对象数组=

  • PDF内容流 表示pdf使用F1字体,设置fontsize 40.959999。 我有一个关于实际字体大小是否为40.959999的问题。因为字体大小40太大了,但是在adobe arcrobat pro中显示的文本没有那么大。 在此pdf中没有意义

  • 我想从现有的pdf中获取图像字段,并用其他图像填充它,以使用java中的pdfbox库创建新的pdf文件

  • 我正在寻找如何使用Golang从Kubernetes集群中的一个pod获取日志的解决方案。我查看了“https://github.com/kubernetes/client-go”和“https://godoc.org/sigs.k8s.io/controller-runtime/pkg/client”,但不理解如何将它们用于此目的。在K8S中,除了日志之外,我没有任何问题可以获取pod或任何其他

  • 我使用Apache pdfbox来提取文本。我可以从pdf中提取文本,但我不知道如何知道这个词是否加粗???(代码建议很好!!!)下面是从pdf中提取纯文本的代码,效果很好。

  • 我正在尝试将pdf字段与行中的第一个字段对齐。我能得到磁场和它的位置。我也可以在本地更改它,但当我保存pdf时,字段显示在同一位置。以下是代码: