在java中提取Identity-H编码的PDF文本并使用PDFBox替换
我正在努力阅读用Identity-H(TrueType(CID))编码的PDF文档。当我得到Tj的标记值时,我能够找到不可读的字符串(随机符号)。我需要任何关于如何解决这个问题的建议,因为我需要从PDF中找到某些字符串并替换它们在java中提取Identity-H编码的PDF文本并使用PDFBox替换,java,pdf,encoding,pdfbox,text-extraction,Java,Pdf,Encoding,Pdfbox,Text Extraction,我正在努力阅读用Identity-H(TrueType(CID))编码的PDF文档。当我得到Tj的标记值时,我能够找到不可读的字符串(随机符号)。我需要任何关于如何解决这个问题的建议,因为我需要从PDF中找到某些字符串并替换它们 public void doIt( String inputFile, String outputFile, String strToFind, String message) throws IOException, COSVisitorExce
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<pages.size(); 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<tokens.size(); 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<previous.size(); 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();
}
}
}
public void doIt(字符串输入文件、字符串输出文件、字符串strofind、字符串消息)
抛出IOException,COSVisitorException
{
//文件
PDDocument=null;
尝试
{
doc=PDDocument.load(输入文件);
列表页面=doc.getDocumentCatalog().getAllPages();
对于(int i=0;i请共享PDF,尽管由于以下几个原因该作业可能不可能:1)“为什么删除了ReplaceText示例?”2)如果字体被嵌入,替换字形可能会丢失。请仔细查看您的PDF与PDFDebugger快照,如在这个答案中看到的Tilman Hausherr谢谢您的评论。请分享PDF,虽然这项工作可能是不可能的有几个原因:1)“为什么RePeTeExt示例被删除了?”2)如果字体被嵌入,替换字形可能会丢失。请仔细查看您的PDF与PDFDebugger快照,如在这个答案中看到的Tilman Hausherr谢谢您的评论。