This code snippet will explain how to create text highlight plug-in using Acrobat SDK. I assume that you've already know how to implement basic plug-in functionality using Acrobat SDK. The version of the SDK used in this code example is Acrobat XI SDK. I also assume following requirements,
- Read PDF 32000-1:2008 12.5.6.10, “Text Markup Annotations”, for further information
wwwimages.adobe.com/content/dam/Adobe/en/devnet/pdf/pdfs/PDF32000_2008.pdf - There already exist a COS Dictionary with all the terms in the PDF document. COS dictionary is similar to a Java HashMap. It stores <Key,Value> pairs and in this case <term,offset> values.
- Offset of a term is the index inside the PDF document. As an example, first term of the PDF document starts with 0, and next 1 so on.
- You can use PDWordFinderAcquireWordList() method to get the total word list and then use a loop to create the CosObj Dic. Read my previous post about how to extract terms from PDF and create COS Dictionary.
void highlightText() { // There is a term "explosive" in the Cos Dictionary Dict and get its offset CosObj offset = CosDictGet(Dict,ASAtomFromString("explosive")); //Create Highlight HliteEntry object to keep track of the offset (start index) //and the length which is how many terms to highlight. HiliteEntry hilite; hilite.offset = CosIntegerValue(offset); hilite.length = 1; AVDoc currentAVDoc = AVAppGetActiveDoc(); PDDoc currentPDDoc = AVDocGetPDDoc(currentAVDoc); AVPageView currentPageView = AVDocGetPageView(currentAVDoc); ASInt32 pageNum = AVPageViewGetPageNum(currentPageView); PDEElement pdeElement; ASFixedRect boundingRect; // bounding rectangle of the term PDPage pdPage = PDDocAcquirePage (currentPDDoc, pageNum); PDAnnot pdAnnot; // Set the color you want to highlight your text PDColorValueRec red; red.space = PDDeviceRGB; red.value[0] = ASInt32ToFixed(1); red.value[1] = 0; red.value[2] = 0; // highlight AVPageViewSetColor(currentPageView, &red); PDTextSelect textSelection = PDTextSelectCreateWordHilite(pdPage,&hilite, 1); AVDocSetSelection(currentAVDoc, ASAtomFromString("Text"),(void *)textSelection, true); AVPageViewDrawNow(currentPageView); AVDocShowSelection (currentAVDoc); // make text selection and get the bounding rectangle of the selection. PDTextSelect selectedText = static_cast(AVDocGetSelection(currentAVDoc)); PDTextSelectGetBoundingRect(selectedText,&boundingRect); // use the bounding rectangle to create a highlight annotation QuadPoints // and bounding rectangle Cos objects. We need these 2 to create highlight type. CosObj ArrayObj, RecObj; CosDoc cd = PDDocGetCosDoc(currentPDDoc); CosObj cosPage = PDPageGetCosObj(pdPage); ArrayObj = CosNewArray(cd,false,8); CosArrayPut(ArrayObj,0,CosNewFixed(cd,false, boundingRect.right)); CosArrayPut(ArrayObj,1,CosNewFixed(cd,false, boundingRect.bottom)); CosArrayPut(ArrayObj,2,CosNewFixed(cd,false, boundingRect.left)); CosArrayPut(ArrayObj,3,CosNewFixed(cd,false, boundingRect.bottom)); CosArrayPut(ArrayObj,4,CosNewFixed(cd,false, boundingRect.right)); CosArrayPut(ArrayObj,5,CosNewFixed(cd,false, boundingRect.top)); CosArrayPut(ArrayObj,6,CosNewFixed(cd,false, boundingRect.left)); CosArrayPut(ArrayObj,7,CosNewFixed(cd,false, boundingRect.top)); // Now create bounding rectangle points RecObj = CosNewArray(cd,false,4); CosArrayPut(RecObj,0,CosNewFixed(cd,false, boundingRect.left)); CosArrayPut(RecObj,1,CosNewFixed(cd,false, boundingRect.right)); CosArrayPut(RecObj,2,CosNewFixed(cd,false, boundingRect.bottom)); CosArrayPut(RecObj,3,CosNewFixed(cd,false, boundingRect.top)); // These are the properties to set in order to create a text highlight // PDF 32000-1:2008 12.5.6.10, “Text Markup Annotations”, Table 164 and Table 179 CosObj cosDict = CosNewDict(cd, true, 4); CosDictPutKeyString(cosDict, "Subtype", CosNewNameFromString(cd, false, "Highlight")); CosDictPutKeyString(cosDict, "QuadPoints",ArrayObj); CosDictPutKeyString(cosDict, "Rect", RecObj); pdAnnot = PDAnnotFromCosObj(cosDict); PDPageAddAnnot(pdPage,-2,pdAnnot); PDPageNotifyContentsDidChange(pdPage); PDAnnotSetColor(pdAnnot, &red); AVPageViewDrawNow (currentPageView); PDPageRelease (pdPage); }
No comments:
Post a Comment