java 令牌解析_Java - PDFBox - ReplaceString - 解析的令牌问题(可能编码?)

我一直在努力解决与PDFBox和PDF编辑相关的问题 . 我被分配了一个任务,即在给定PDF文件的情况下编辑几个字符串,并将带有编辑过的字符串的文件的镜像版本输出到其中 . 我被告知过去使用这个工具已经解决了这个问题,所以我被告知要做同样的事情 . 我正在使用的功能是这样的:

public void doIt( String inputFile, String outputFile, String strToFind, String message)

throws IOException, COSVisitorException

{

// the document

PDDocument doc = null;

try

{

doc = PDDocument.load( inputFile );

List pages = doc.getDocumentCatalog().getAllPages();

for( int i=0; i

{

PDPage page = (PDPage)pages.get( i );

PDStream contents = page.getContents();

PDFStreamParser parser = new PDFStreamParser(contents.getStream() );

parser.parse();

List tokens = parser.getTokens();

for( int j=0; j

{

Object next = tokens.get( j );

if( next instanceof PDFOperator )

{

PDFOperator op = (PDFOperator)next;

//Tj and TJ are the two operators that display

//strings in a PDF

if( op.getOperation().equals( "Tj" ) )

{

//Tj takes one operator and that is the string

//to display so lets update that operator

COSString previous = (COSString)tokens.get( j-1 );

String string = previous.getString();

string = string.replaceFirst( strToFind, message );

previous.reset();

previous.append( string.getBytes("ISO-8859-1") );

}

else if( op.getOperation().equals( "TJ" ) )

{

COSArray previous = (COSArray)tokens.get( j-1 );

for( int k=0; k

{

Object arrElement = previous.getObject( k );

if( arrElement instanceof COSString )

{

COSString cosString = (COSString)arrElement;

String string = cosString.getString();

string = string.replaceFirst( strToFind, message );

cosString.reset();

cosString.append( string.getBytes("ISO-8859-1") );

}

}

}

}

}

//now that the tokens are updated we will replace the

//page content stream.

PDStream updatedStream = new PDStream(doc);

OutputStream out = updatedStream.createOutputStream();

ContentStreamWriter tokenWriter = new ContentStreamWriter(out);

tokenWriter.writeTokens( tokens );

page.setContents( updatedStream );

}

doc.save( outputFile );

}

finally

{

if( doc != null )

{

doc.close();

}

}

}

但是,我给出的文件根本没有被修改过 . 什么都没发生 . 经过进一步检查,我决定分析解析器生成的令牌的顺序 . 正在COSString元素以外的所有内容中正确解析该文件,其中包含看起来像是错误编码的乱码字符(随机符号和数字串) . 我尝试解析其他文档,并且该函数可以与其中一些文档一起使用,但不是我作为输入传递的所有内容(乳胶输出文件已正确修改并且已正确编码COSStrings,而其他自动生成的pdfs没有产生带有乱码COSString内容的结果) . 我也很确定正在正确读取结构的其余部分,因为我在不同的文件上重建输出,并且输出文件看起来与输入完全相同,这似乎意味着正在正确分析文件结构 . 该文件包含Identity-H编码字体 .

我尝试使用PDFTextStripper(从PDF中提取文本)解析同一个文件,并从那里解析输出返回正确的文本输出,使用:

PDFTextStripper pdfStripper = new PDFTextStripper("UTF-8");

String result = pdfStripper.getText(doc);

System.out.println(result);

这可能是编码问题吗?我可以告诉PDFStreamParser(或负责任的人)强制读取编码吗?它甚至是编码问题,因为文本提取工作正常吗?

在此先感谢您的帮助 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值