Quantcast
Channel: Adobe Community: Message List - Acrobat SDK
Viewing all articles
Browse latest Browse all 10848

VBA inserting form fields, different positions result for different users.

$
0
0

I'm certianly at a loss for wrapping my head around this.

 

Adobe Acrobat 9 Standard (v 9.5.4)

Excel 2010  (VBA)

 

The problem:  When I create the PDF document from Excel, I search for a string of text in order to capture the Quads for the containing rectangle.  Then I use the quads to insert a control with numeric offsets.  The problem that I am facing is that the offsets seem to be causing the controls to be in different locations for different users.  For example, when I send (-26, -2, 100, 10) {x-offset, y-offset, width, height}; the control aligns exactly where I want it.  But when another user user runs the exact same routine, or opens the PDF that I created, the fields are no longer positioned correctly.

 

Is there some setting that I am missing? EDIT, SOLVED:  My Acrobat had a custom point to pixel setting.  (Preferences > Page Display > Resolution)

 

Private Function makePdfControl(ByVal pdfPage As Integer, keyTerm As String, Optional ByVal keyTermLookAhead As Integer = 0, Optional ctrlType As String = "text", Optional cCoords As Variant = 0)

 

    'pdfPage is the target page of the document

    'keyTerm is the assembled search term: "Date Shipped >> DATESHIPPED"

    'keyTermLookAhead is the number of words assembed into KeyTerm, zero based: "Date Shipped" >>  "DATESHIPPED" >> "DATE" = 0, "SHIPPED" = 1

    'ctrlType determines the type of control to place on the form; default is text

    'cCoords carries an array of integers: x-offset, y-offset, width, and height

 

    txt = ""

    Dim fkt As Integer 'counter for keyTermLookAhead

    Dim matchFound As Boolean 'flag that a match has been found

    Dim maxWords As Integer 'the maximum number of words in pdfPage

    Dim coord(3) As Integer 'local array container to provide interface for cCoords

 

    p = 0

 

    matchFound = False

    maxWords = jso.getPageNumWords(pdfPage)

 

    Do While p + keyTermLookAhead <= maxWords 'search all words in the target page; break if not found

 

        p = p + 1

 

        For fkt = 0 To keyTermLookAhead

 

            txt = txt & jso.getPageNthWord(pdfPage, p + fkt)

 

        Next fkt

 

        If UCase(txt) <> UCase(keyTerm) Then 'the assembly of terms is complete, check if match

            txt = "" 'prepare "txt" for next assembly

            matchFound = False

        Else

            matchFound = True 'we've struck gold, exit the loop preserving val of "p" as the first word in the assembly

            Exit Do

        End If

 

    Loop

 

    If matchFound = True Then

 

        Dim qtmp() As Variant

        Dim q(7) As Double

 

        qtmp = jso.getPageNthWordQuads(pdfPage, p)(0) 'collect the rectangle containing the first word of the search; output is a base-0x7 array

 

        For a = 0 To 7

 

            q(a) = qtmp(a) 'collect the data

 

        Next a

 

        If VarType(cCoords) <> 8204 Then '8204 means that we've inserted an array into the Varient type var cCoords

            coord(0) = 0

            coord(1) = 0

            coord(2) = 100

            coord(3) = 15

        Else

            coord(0) = cCoords(0) 'x-offset value

            coord(1) = cCoords(1) 'y-offset value

            coord(2) = cCoords(2) 'width value

            coord(3) = cCoords(3) 'height value

        End If

 

        x0 = coord(0) 'x-offset var

        y0 = coord(1) 'y-offset var

 

        w = coord(2) 'ctrl width

        h = coord(3) 'ctrl height

 

        x = q(0) + x0

        y = q(7) - h + y0

 

        'origin point of doc matrix is lower-left corner

        'origin point of control is lower left corner of the rectangle containing the first word of the search phrase

        'offsets are placed from this point, negative x shifts to the left, negative y shifts down

        'values are in points, not pixels

        Set f = aForm.Fields.Add(keyTerm, ctrlType, pdfPage, x, y, x + w, y + h) '(uplf, lwlf, lwrt, uprt) 'add the control to the form using values passed in

 

    End If

 

End Function

 

The above function is used while looping through the pages of the created PDF document.  I am using the following function to create the document from Excel:

 

Private Sub exportToPDF()

 

    DoEvents

 

    Application.ScreenUpdating = False

 

    Call showTabs(False)

 

    ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _

                                       Filename:=pdfPathData, _

                                       Quality:=xlQualityStandard, _

                                       IncludeDocProperties:=False, _

                                       IgnorePrintAreas:=False, _

                                       OpenAfterPublish:=False

 

    Call showTabs(True)

 

    Call locateDoc

 

    Application.ScreenUpdating = True

 

End Sub

 

Message was edited by: ilivingston:  solved


Viewing all articles
Browse latest Browse all 10848

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>