Hi,

First: I had a look at IF, but AT is better suited for the task, IMHO.

Now for some details:

Here's a simple fo file with a named block:

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format";>
        <fo:layout-master-set>
                <fo:simple-page-master master-name="x">
                        <fo:region-body/>
                </fo:simple-page-master>
        </fo:layout-master-set>
        <fo:page-sequence master-reference="x">
                <fo:flow flow-name="xsl-region-body">
                        <fo:block>
                                <fo:block id="block-to-find">
                                        <fo:inline>testtext </fo:inline>
                                </fo:block>
                        </fo:block>
                </fo:flow>
        </fo:page-sequence>
</fo:root>

Here's the area tree for this fo (fop test.fo -at test.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!--Produced by Apache FOP Version svn-trunk-->
<areaTree>
        <pageSequence>
                <pageViewport bounds="0 0 594720 792000" key="P1" nr="1" 
formatted-nr="1" simple-page-master-name="x">
                        <page>
                                <regionViewport ipd="594720" bpd="792000" 
ipda="594720" bpda="792000" bap="0 0 0 0" is-viewport-area="true" rect="0 0 
594720 792000">
                                        <regionBody ipd="594720" bpd="792000" 
ipda="594720" bpda="792000" bap="0 0 0 0" is-reference-area="true" 
name="xsl-region-body" ctm="[1.0 0.0 0.0 1.0 0.0 0.0]">
                                                <beforeFloat/>
                                                <mainReference ipd="0" bpd="0" 
bap="0 0 0 0" is-reference-area="true">
                                                        <span ipd="594720" 
bpd="14400" ipda="594720" bpda="14400" bap="0 0 0 0" is-reference-area="true">
                                                                <flow 
ipd="594720" bpd="14400" ipda="594720" bpda="14400" bap="0 0 0 0" 
is-reference-area="true">
                                                                        <block 
ipd="594720" bpd="14400" ipda="594720" bpda="14400" bap="0 0 0 0">
                                                                                
<block ipd="594720" bpd="14400" ipda="594720" bpda="14400" bap="0 0 0 0" 
prod-id="block-to-find">
                                                                                
        <lineArea ipd="594720" bpd="11100" ipda="594720" bpda="14400" bap="0 0 
0 0" space-before="1650" space-after="1650">
                                                                                
                <inlineparent ipd="38688" bpd="11100" ipda="38688" bpda="11100" 
bap="0 0 0 0" offset="0">
                                                                                
                        <text offset="0" baseline="8616" ipd="38688" 
bpd="11100" ipda="38688" bpda="11100" bap="0 0 0 0" font-name="sans-serif" 
font-style="normal" font-weight="400" font-size="12000" color="#000000">
                                                                                
                                <word offset="0">testtext</word>
                                                                                
                        </text>
                                                                                
                </inlineparent>
                                                                                
        </lineArea>
                                                                                
</block>
                                                                        </block>
                                                                </flow>
                                                        </span>
                                                </mainReference>
                                                <footnote top-offset="0"/>
                                        </regionBody>
                                </regionViewport>
                        </page>
                </pageViewport>
        </pageSequence>
</areaTree>

Now look for the block element with attribute prod-id="block-to-find". That's 
your target block. As Craig said, if the block spans more pages, there may be 
more than one block with this attribute.

Now you can get the width of the block (attribute ipd) and the height 
(attribute bpd). Use ipda and bpda if you need the padding, too. Also see 
http://wiki.apache.org/xmlgraphics-fop/AreaTreeXMLDocumentation or search this 
mailing list for "area tree".
For the block's position in the page, add the height of all previous blocks in 
the page.

Regards,

Georg Datterl

------ Kontakt ------

Georg Datterl

Geneon media solutions gmbh
Gutenstetter Straße 8a
90449 Nürnberg

HRB Nürnberg: 17193
Geschäftsführer: Yong-Harry Steiert

Tel.: 0911/36 78 88 - 26
Fax: 0911/36 78 88 - 20

www.geneon.de

Weitere Mitglieder der Willmy MediaGroup:

IRS Integrated Realization Services GmbH:    www.irs-nbg.de
Willmy PrintMedia GmbH:                            www.willmy.de
Willmy Consult & Content GmbH:                 www.willmycc.de


-----Ursprüngliche Nachricht-----
Von: Craig Ringer [mailto:cr...@postnewspapers.com.au]
Gesendet: Dienstag, 5. Oktober 2010 02:35
An: fop-users@xmlgraphics.apache.org
Cc: mithunk
Betreff: Re: AW: Identifying absolute position of a FO:Block

On 4/10/2010 11:28 PM, mithunk wrote:
>
> Thanks Georg,
>
> I am new to FOP. Can you please help me with how to calculate the position
> by giving a block id.
> I modified my XSL with a block id (for a field), now dont know how to
> calculate the position.

METHOD 1:

Use fop to produce the intermediate "area tree" output from your XSL-FO.
See the documentation for details on that.

Once you have the area tree, use xpath to find the block. IIRC the id
will be in the 'prod-id' attribute of the block(s) generated. If it's
broken across a page, column, etc there may be more than one element
generated.

Once you've found the element(s) you should be able to work out the
position from the positioning attributes them and their parent elements.

It's possible that the new intermediate format ("IF") is better than the
area tree for this, but I haven't worked with it much so all I can
suggest is generating it, looking at it, and seeing if it's useful. I
have the feeling the new IF doesn't include element IDs, but I may be
misremembering.

--
Craig Ringer

Tech-related writing at http://soapyfrogs.blogspot.com/

---------------------------------------------------------------------
To unsubscribe, e-mail: fop-users-unsubscr...@xmlgraphics.apache.org
For additional commands, e-mail: fop-users-h...@xmlgraphics.apache.org

Reply via email to