我正在使用烘焙到ColdFusion中的iText库来重命名PDF表单字段。我可以很容易地重命名字段名称,但是当您将鼠标悬停在与该字段的新名称不匹配的字段上时,生成的PDF显示“工具提示”。
我做了一些研究,看起来工具提示存储在字段字典的“ / TU”键中,并且可以使用setUserName()
方法进行设置。但是,当我检查代码中的各个对象时,看不到任何方法可以访问特定PDF字段的该方法。
如何使用iText库设置此“ / TU”键?
到目前为止,这是我的代码:
function renameFields( pathToFile ) {
// initialize the PDF file we will be working on
local.pdfService = new pdf();
local.pdfService.setSource( arguments.pathToFile );
local.pdfFile = local.pdfService.read();
// initialize the iText library objects
local.pdfReader = createObject("java", "com.lowagie.text.pdf.PdfReader").init( toBinary( local.pdfFile ) );
local.outputStream = createObject("java", "java.io.ByteArrayOutputStream").init();
local.pdfStamper = createObject("java", "com.lowagie.text.pdf.PdfStamper").init( local.pdfReader, local.outputStream);
// get an instance of the acro fields object
local.acroFields = local.pdfStamper.getAcroFields();
// Get All of the Fields of the PDF
local.allFields = local.acroFields.getFields();
// convert the collection of fields into an array for easy iteration
local.fieldArray = listToArray( structKeyList( local.acroFields.getFields() ) );
// loop through all fields and rename them
for ( var a=1; a < arrayLen( local.fieldArray ); a++ ) {
// do the actual renaming
local.acroFields.renameField( local.fieldArray[a], "field_#a#" );
// update the field tooltip ???
}
// finish up and return the pdf file object
local.pdfStamper.setFormFlattening( false );
local.pdfStamper.close();
local.pdfReader.close();
local.myPdf = local.outputStream.toByteArray();
return local.myPdf;
}
CFML解决方案(更新7/31/2018)
注意:在此解决方案中,我先更改工具提示,然后重命名该字段。
function renameFields( pathToFile ) {
// initialize the PDF file we will be working on
local.pdfService = new pdf();
local.pdfService.setSource( arguments.pathToFile );
local.pdfFile = local.pdfService.read();
// initialize the iText library objects
local.pdfReader = createObject("java", "com.lowagie.text.pdf.PdfReader").init( toBinary( local.pdfFile ) );
local.outputStream = createObject("java", "java.io.ByteArrayOutputStream").init();
local.pdfStamper = createObject("java", "com.lowagie.text.pdf.PdfStamper").init( local.pdfReader, local.outputStream);
// get an instance of the acro fields object
local.acroFields = local.pdfStamper.getAcroFields();
// Get All of the Fields of the PDF
local.allFields = local.acroFields.getFields();
// convert the collection of fields into an array for easy iteration
local.fieldArray = listToArray( structKeyList( local.acroFields.getFields() ) );
// loop through all fields and rename them
for ( var a=1; a < arrayLen( local.fieldArray ); a++ ) {
// create the tooltip text
local.newTooltip = createObject( "java", "com.lowagie.text.pdf.PdfString" ).init( "field_#a#" );
// update the field tooltip
local.field = local.acroFields.getFieldItem( local.fieldArray[a] );
local.field.values[ 1 ].put( local.pdfName.TU, local.newTooltip );
// do the actual renaming
local.acroFields.renameField( local.fieldArray[a], "field_#a#" );
}
// finish up and return the pdf file object
local.pdfStamper.setFormFlattening( false );
local.pdfStamper.close();
local.pdfReader.close();
local.myPdf = local.outputStream.toByteArray();
return local.myPdf;
}
答案 0 :(得分:1)
我不知道ColdFusion(语法),但是解决方案应如下所示:
// loop through all fields and rename them
for ( var a=1; a < arrayLen( local.fieldArray ); a++ ) {
// do the actual renaming
local.acroFields.renameField( local.fieldArray[a], "field_#a#" );
// update the field tooltip (if you already renamed it might have to use the new name)
Item field = local.acroFields.getFieldItem(local.fieldArray[a]);
field.getValue(0).put(PdfName.TU, new PdfString("SomeNewTooltip"));
}