java中怎么使文本对齐_java – 是否可以在PDFBOX中对齐文本?

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

解决方法:

This older answer显示了如何将字符串分解为适合给定宽度的子字符串.要制作示例代码,请以填充整个行宽的方式绘制子字符串,替换如下(取决于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);

}

(从BreakLongString.java测试testBreakStringJustified for PDFBox 1.8.x)

如果你想知道替换(‘,’,’.’)

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);

}

(从BreakLongString.java开始测试testBreakStringJustified for PDFBox 2.0.x)

该解决方案仅使用额外的字符间距(运算符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,即使它已被标记为已弃用.

标签:java,apache,pdf-generation

来源: https://codeday.me/bug/20190919/1812121.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用开源库Apache PDFBox来解析PDF文件,包括提取文本和图片。以下是一个简单的示例代码,演示如何读取PDF文本和图片: ```java import java.io.File; import java.io.IOException; import java.util.List; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.RenderedImage; public class PDFParser { public static void main(String[] args) throws IOException { // 读取PDF文件 PDDocument document = PDDocument.load(new File("example.pdf")); // 提取文本 PDFTextStripper stripper = new PDFTextStripper(); String text = stripper.getText(document); System.out.println("文本内容:\n" + text); // 提取图片 List<PDPage> pages = document.getPages(); PDFRenderer renderer = new PDFRenderer(document); int pageNum = 1; for (PDPage page : pages) { // 渲染页面为图像 RenderedImage image = renderer.renderImageWithDPI(pageNum - 1, 300, ImageType.RGB); // 保存图像到文件 File outputFile = new File("page" + pageNum + ".png"); ImageIO.write(image, "png", outputFile); pageNum++; } // 关闭文档 document.close(); } } ``` 此示例将提取PDF文件文本并将其打印到控制台,然后提取每个页面的图像并将其保存到文件。请注意,这将生成一个PNG图像文件,其包含PDF页面的可见内容。如果您需要提取PDF的矢量图形,请使用不同的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值