是否可以在PDFBOX中证明文本的合理性?

 战地上尉 发布于 2023-02-09 11:31

PDFBOX API中是否有任何函数可以使文本合理,或者我们必须手动执行?如果手动然后如何使用java(其背后的逻辑)证明文本

1 个回答
  • 这个较旧的答案显示了如何将字符串分解为适合给定的子字符串width.要制作示例代码,请以填充整个行宽的方式绘制子字符串,替换如下(取决于PDFBox版本):

    PDFBox 1.8.x

    替换最后一个循环

    for (String line: lines)
    {
        contentStream.drawString(line);
        contentStream.moveTextPositionByAmount(0, -leading);
    }
    

    这个更精致的一个:

    for (String line: lines)
    {
        float charSpacing = 0;
        if (line.length() > 1)
        {
            float size = fontSize * pdfFont.getStringWidth(line) / 1000;
            float free = width - size;
            if (free > 0)
            {
                charSpacing = free / (line.length() - 1);
            }
        }
        contentStream.appendRawCommands(String.format("%f Tc\n", charSpacing).replace(',', '.'));
    
        contentStream.drawString(line);
        contentStream.moveTextPositionByAmount(0, -leading);
    }
    

    (来自PDFL1.x.x的BreakLongString.java测试testBreakStringJustified)

    如果你想知道replace(',', '.')in

    contentStream.appendRawCommands(String.format("%f Tc\n", charSpacing).replace(',', '.'));
    

    ...我的语言环境使用逗号作为小数分隔符,并且在我的第一次测试运行后在页面内容中产生了逗号,我有点懒,只是添加了替换以修复事物......

    PDFBox 2.0.x

    替换最后一个循环

    for (String line: lines)
    {
        contentStream.showText(line);
        contentStream.newLineAtOffset(0, -leading);
    }
    

    这个更精致的一个:

    for (String line: lines)
    {
        float charSpacing = 0;
        if (line.length() > 1)
        {
            float size = fontSize * pdfFont.getStringWidth(line) / 1000;
            float free = width - size;
            if (free > 0)
            {
                charSpacing = free / (line.length() - 1);
            }
        }
        contentStream.setCharacterSpacing(charSpacing);
    
        contentStream.showText(line);
        contentStream.newLineAtOffset(0, -leading);
    }
    

    (来自PDFLintestBreakStringJustified 2.0.x的BreakLongString.java测试)


    该解决方案仅使用额外的字符间距(运算符Tc)来进行调整.您可能会使用额外的字间距(运算符Tw),它只会扩展空格字符,或两者的组合; 但请注意:字间距不适用于所有字体编码.有关这些操作数的更多信息,请参阅 表105 文本状态运算符,第9.3.2节字符间距和第9.3.3节PDF规范ISO 32000-1中的字间距

    而不是前者

    非正当

    你现在得到了

    在此输入图像描述

    如你所见,仍有一个小的赤字,一段的最后一行显然不应该是合理的.因此,在最后一行中,请使用0字符间距:

        contentStream.appendRawCommands("0 Tc\n"); // PDFBox 1.8.x
    
        contentStream.setCharacterSpacing(0); // PDFBox 2.0.x
    

    PS我刚刚偶然发现setCharacterSpacing当前(2016年11月)仅在2.1.0-SNAPSHOT开发版本而不是2.0.x版本中.因此,在2.0.x中,您可能不得不重新使用appendRawCommands,即使它已被标记为已弃用.

    2023-02-09 11:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有