Aspose.pdf java版本 如何一个字一个字输出pdf中文本内容,并按照顺序依次给每个字加入不同的ForegroundColor

public static void main(String[] args) {
	// TODO Auto-generated method stub
	String fileName = "";
	Document pdfdoc = new Document(fileName);
	TextFragmentAbsorber tfa = new TextFragmentAbsorber();
	pdfdoc.getPages().accept(tfa);
	TextFragmentCollection tfc = tfa.getTextFragments();
	for (TextFragment tf : (Iterable<TextFragment>) tfc) {
		tf.getTextState().setForegroundColor("特定的颜色");
		System.out.println("text:"+ tf.getText());
	}
	System.out.println("well done");
}

这种方式输出的文本,无法给每个字加入ForegroundColor,只能给tf输出的对应文本加入ForegroundColor

@pilixiaopang

您也可以和我们分享您的样本PDF文档。我们将在我们的环境中测试该场景并相应地解决它。

@ asad.ali
这个是测试的pdf样本test1.pdf (2.5 KB)

@pilixiaopang

API以首先添加文本的方式从文档中提取文本。但是,我们还注意到,整个文本行被提取为单个TextFragment。因此,我们已在问题跟踪系统中将调查凭单记录为PDFJAVA-39967。我们将调查其详细信息,并向您发布其解决状态。请耐心等待,为我们节省一些时间。

对此造成的不便,我们表示歉意。

@pilixiaopang

我们想与您分享我们已经调查了先前记录的故障单:

解决方法是,您可以在文本片段内重新创建文本片段(删除旧片段并在其位置创建新片段),从而可以为每个片段设置不同的颜色。请查看下面的代码片段,并记住您应该使用合适的字体(我在代码片段中使用了“ Arial Unicode MS”)。

Document doc = new Document(dataDir + "test1.pdf");
TextFragmentAbsorber tfa = new TextFragmentAbsorber();
doc.getPages().accept(tfa);  
TextFragmentCollection tfc = tfa.getTextFragments();

Font font = FontRepository.findFont("Arial Unicode MS");
Random rand = new Random();

for (TextFragment tf : tfc) {
    String text = tf.getText();
    double mediumDistanceBetweenChars = tf.getRectangle().getWidth() / text.length();    

    // Remove previous fragment
    for (TextSegment seg : tf.getSegments()) {
        seg.setText("");
    }

    for (int i = 0; i < text.length(); i++) {
        TextSegment textSegment = new TextSegment(String.valueOf(text.charAt(i)));
        textSegment.setPosition(new Position(
        tf.getPosition().getXIndent() + i * mediumDistanceBetweenChars,
        tf.getPosition().getYIndent() * 2 - tf.getBaselinePosition().getYIndent()));
        textSegment.getTextState().setFont(font);

        // Set Random color    
        textSegment.getTextState().setForegroundColor(
        Color.fromArgb(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)));    
        tf.getSegments().add(textSegment);
    }
  }