【问题标题】:Detecting text field overflow检测文本字段溢出
【发布时间】:2018-04-04 06:13:39
【问题描述】:

假设我有一个 PDF 文档,其中包含定义了某些字体和大小的文本字段,有没有办法使用 PDFBox 确定某些文本是否适合字段矩形?

我试图避免文本没有完全显示在字段内的情况,所以如果文本在给定字体和大小的情况下溢出,我想将字体大小更改为Auto (0)。

【问题讨论】:

  • 你试过PDFont.getStringWidth吗?
  • 是的,我试过了,但我不确定将结果与什么进行比较?我试图与 field.getWidgets().get(0).getRectangle().getWidth() 进行比较,但我不确定我得到的结果是否有意义。你能提供一个你认为应该可以工作的sn-p代码吗?谢谢
  • 天哪!到目前为止,我确实遇到了这个问题...... :) 看看我是否可以让它工作
  • 稍后我会做一些测试并分享我的发现

标签: java pdf pdfbox


【解决方案1】:

此代码重新创建外观流以确保它存在以便有一个 bbox(它可以比矩形小一点)。

public static void main(String[] args) throws IOException
{
    // file can be found at https://issues.apache.org/jira/browse/PDFBOX-142
    // https://issues.apache.org/jira/secure/attachment/12742551/Testformular1.pdf
    try (PDDocument doc = PDDocument.load(new File("Testformular1.pdf")))
    {
        PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
        PDTextField field = (PDTextField) acroForm.getField("Name");
        PDAnnotationWidget widget = field.getWidgets().get(0);
        // force generation of appearance stream
        field.setValue(field.getValue());
        PDRectangle rectangle = widget.getRectangle();
        PDAppearanceEntry ap = widget.getAppearance().getNormalAppearance();
        PDAppearanceStream appearanceStream = ap.getAppearanceStream();
        PDRectangle bbox = appearanceStream.getBBox();
        float fieldWidth = Math.min(bbox.getWidth(), rectangle.getWidth());
        String defaultAppearance = field.getDefaultAppearance();
        System.out.println(defaultAppearance);

        // Pattern must be improved, font may have numbers
        // /Helv 12 Tf 0 g
        final Pattern p = Pattern.compile("\\/([A-z]+) (\\d+).+");
        Matcher m = p.matcher(defaultAppearance);
        if (!m.find() || m.groupCount() != 2)
        {
            System.out.println("oh-oh");
            System.exit(-1);
        }
        String fontName = m.group(1);
        int fontSize = Integer.parseInt(m.group(2));
        PDResources resources = appearanceStream.getResources();
        if (resources == null)
        {
            resources = acroForm.getDefaultResources();
        }
        PDFont font = resources.getFont(COSName.getPDFName(fontName));
        float stringWidth = font.getStringWidth("Tilman Hausherr Tilman Hausherr");
        System.out.println("stringWidth: " + stringWidth * fontSize / 1000);
        System.out.println("field width: " + fieldWidth);
    }
}

输出是:

/Helv 12 Tf 0 g
stringWidth: 180.7207
field width: 169.29082

【讨论】:

    猜你喜欢
    • 2020-03-06
    • 1970-01-01
    • 2011-11-18
    • 2011-12-05
    • 2017-10-16
    • 2011-09-18
    相关资源
    最近更新 更多