为了隐身术,我需要稍微更改文本块的y坐标(BT
流中ET
和/Contents
命令之间的y坐标。
枚举很简单。您必须为PdfReaderContentParser
实施回调或直接使用PRTokeniser
拆分内容:
final PdfReaderContentParser contentParser = new PdfReaderContentParser(reader);
final byte[] contentBytes = ContentByteUtils.getContentBytesForPage(reader, 1);
final PRTokeniser tokeniser = new PRTokeniser(new RandomAccessFileOrArray(
new RandomAccessSourceFactory().createSource(contentBytes)));
final PdfContentParser ps = new PdfContentParser(tokeniser);
final ArrayList<PdfObject> operands = new ArrayList<PdfObject>();
while (ps.parse(operands).size() > 0) {
final PdfLiteral operator = (PdfLiteral) operands.get(operands.size() - 1);
if ("Td".equals(operator.toString())) {
System.out.println(operands);
}
}
输出:
[56.8, 775.9, Td]
[523, 775.9, Td]
[56.8, 764.4, Td]
[534.2, 764.4, Td]
[56.8, 752.9, Td]
[56.8, 741.4, Td]
但是,我不知道如何将更改后的令牌保存回内容流。我已经看到example使用PdfTemplate
在文档中移动矩形区域,但它似乎是一种矫枉过正。此外,我无法保证将保留阻止顺序。
我不需要知道文本块中实际编码的人类可读文本是什么,我不关心他们的视觉顺序。我只需要在修改后保留这些块的枚举顺序。
为每个操作数调用toPdf()
是否足够,可能使用空格作为分隔符?换行是否重要?