function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Jeff_SFJeff_SF 

The element type "apex:page" should be terminated by the matching end-tag "</apex:page>"

i am getting an error that is in code. line 287 is the very last line of code.  Any suggestions?
 
<apex:page standardController="Opportunity" renderAs="pdf" sidebar="false" title="Opportunity Quotation">
<apex:composition template="PDF_Header_Template">
    <apex:define name="extraStyle">
<style type="text/css">
.style4 {
    color: #000000;
    font-size: 14px;
    font-weight: bold;
}
#PreparedBy {
    position: absolute;
    width: 77%;
    height: 60px;
    left: 30px;
    top: 145px;
    border: 0px red solid;
}
.ShipAndBillSection {
    position: absolute;
    width: 99%;
    height: 90px;
    left: 5px;
    top: 215px;
    border: 0px blue solid;
}
.ShipAndBill {
    width: 340px;
    height: 90px;
    border: 1px silver solid;
    vertical-align: top;
}
.billToShipToLabel {
    font-size: 12px;
    width: 110px;
    height: 100%;
    vertical-align: top;
}
.addr {
    font-size: 12px;
    width: 450px;
    vertical-align: top;
}
.LineItems {
    position: absolute;
    left: 5px;
    height: 300px;
    top: 330px;
    z-index: 1;
    width: 99%;
    border: 0px green solid;
}
.LineItemsTable {
    width: 100%;
    height: 100%;
    border-top: 0px;
}
.LineItemHeader {
    background-color: gray;
    border: 1px gray solid;
    text-align: right;
}
.TotalColHeader {
    background-color: gray;
    border: 0px gray solid;
    text-align: right;
}
.TotalColRow {
    background-color: silver;
    border-right: 0px silver solid;
    text-align: right;
}
.LineItemCell {
    border-right: 1px silver solid;
    background-color: white;
    text-align: right;
}
#commentBox {
    position: relative;
    left: 100px;
    top: 10px;
    width: 80%;
}
#bottomSection {
    position: absolute;
    top: 770px;
    left: 130px;
    width: 450px;
    border: 0px aqua solid;
}
#ApprovalBlock {
    position: relative;
    left: 0px;
    top: 10px;
    width: 450px;
    border: 0px purple solid;
}
.approvalTable {
    width:100%;
    height:105px;
    border: 0px lime solid;
}
</style>
    </apex:define>
    <apex:define name="PageTitle">{!IF(contains(Opportunity.RecordType.Name,'Addendum'),'WAGE ADJUSTMENT','QUOTATION')}</apex:define>
    <apex:define name="titleBoxInfo">
        <span class="style4"># {!Opportunity.Opportunity_Number__c}</span> <br />
        DATE:&nbsp;&nbsp; <apex:outputText value="{0,date,MM/dd/yyyy}"><apex:param value="{!Opportunity.CreatedDate}" /></apex:outputText>
        <br style="line-height:1.3;" />
        <apex:outputText value="VALID UNTIL: {0,date,MM/dd/yyyy}" rendered="{!IF(OR(ISBLANK(Opportunity.Valid_Until__c),ISNULL(Opportunity.Valid_Until__c)),'FALSE','TRUE')}"><apex:param value="{!Opportunity.Valid_Until__c}" /></apex:outputText>
    </apex:define>
</apex:composition>

<div id="PreparedBy">
    <table cellpadding="2" cellspacing="0" width="100%" border="0">
        <tr>
            <td style="width: 75px">Prepared By</td>
            <td colspan="2">{!$User.FirstName & " " & $User.LastName}</td>
        </tr>
        <tr>
            <td>Phone</td>
            <td colspan="2">{!$User.Phone}</td>
        </tr>
        <tr>
            <td>Email</td>
            <td>{!$User.Email}</td>
            <td style="width:300px;text-align:right;">Customer # {!Opportunity.Account.QB_Account_Number__c}</td>
        </tr>
    </table>
</div>
<div id="ShipAndBillSection" class="ShipAndBillSection">
    <table style="width:100%;height:100%;" cellpadding="0" cellspacing="0">
        <tr>
            <td>
            <table cellpadding="0" cellspacing="0" class="ShipAndBill">
                <tr>
                    <td>
                    <table style="width:100%;height:100%;" cellpadding="1" cellspacing="1">
                        <tr>
                            <td rowspan="3" class="billToShipToLabel">BILL TO:</td>
                            <td class="addr">{!IF(Opportunity.Account.RecordType.Name='Service Customer',Opportunity.Account.Parent.Name,Opportunity.Account.Name)}</td>
                        </tr>
                        <tr><td class="addr">{!IF(Opportunity.Account.RecordType.Name='Service Customer',Opportunity.Account.Parent.BillingStreet,Opportunity.Account.BillingStreet)}</td></tr>
                        <tr><td class="addr">{!IF(Opportunity.Account.RecordType.Name='Service Customer',Opportunity.Account.Parent.BillingCity,Opportunity.Account.BillingCity)}, 
                                             {!IF(Opportunity.Account.RecordType.Name='Service Customer',Opportunity.Account.Parent.BillingState,Opportunity.Account.BillingState)} 
                                             {!IF(Opportunity.Account.RecordType.Name='Service Customer',Opportunity.Account.Parent.BillingPostalCode,Opportunity.Account.BillingPostalCode)}
                            </td>
                        </tr>
                    </table>
                    </td>
                </tr>
            </table>
            </td>
            <td style="width: 30px;">&nbsp;</td>
            <td>
            <table cellpadding="0" cellspacing="0" class="ShipAndBill">
                <tr>
                    <td style="vertical-align: top;">
                    <table style="width:100%;height:100%;" cellpadding="1" cellspacing="1">
                        <tr>
                            <td rowspan="5" class="billToShipToLabel">SERVICE AT:</td>
                            <td class="addr">{!Opportunity.Account.Name}</td>
                        </tr>
                        <tr><td class="addr">{!Opportunity.Account.ShippingStreet}</td></tr>
                        <tr><td class="addr">{!Opportunity.Account.ShippingCity}, 
                                             {!Opportunity.Account.ShippingState} 
                                             {!Opportunity.Account.ShippingPostalCode}</td></tr>
                        <tr><td class="addr">{!Opportunity.Account.Phone}</td></tr>
                    </table>
                    </td>
                </tr>
            </table>
            </td>
        </tr>
    </table>
</div>
    <c:OpportunitySortedItems value="{!Opportunity}" />
<!-- 
<apex:outputPanel layout="block" styleClass="LineItems" rendered="{!IF(OR(contains(Opportunity.RecordType.Name,'Special Service'),contains(Opportunity.RecordType.Name,'Addendum')),'FALSE','TRUE')}">
    <table class="LineItemsTable" cellpadding="5" cellspacing="0">
        <thead>
            <tr class="LineItemHeader">
                <td style="text-align:left;width:15%;">Product Name</td>
                <td style="text-align:left;width:40%;">Description</td>
                <td style="width:15%;">Sales Price</td>
                <td style="width:15%;">Quantity</td>
                <td style="width:15%;" class="TotalColHeader">Total Price</td>
            </tr>
        </thead>
        <apex:repeat var="line" value="{!Opportunity.OpportunityLineItems}" >
                <tr>
                    <td class="LineItemCell" style="text-align:center;border-bottom:1px silver solid;border-left:1px silver solid;">{!line.PricebookEntry.Name}</td>
                    <td class="LineItemCell" style="text-align:left;border-bottom:1px silver solid;">{!line.Description}</td>
                    <td class="LineItemCell" style="border-bottom:1px silver solid;"><apex:outputText value="{0, number, $###,###.00}">
                          <apex:param value="{!line.UnitPrice}" />
                        </apex:outputText>
                    </td>
                    <td class="LineItemCell" style="border-bottom:1px silver solid;"><apex:outputText value="{0, number, #,###.00}">
                          <apex:param value="{!line.Quantity}" />
                        </apex:outputText>
                    </td>
                    <td class="TotalColRow" style="border-bottom:1px silver solid;"><apex:outputText value="{0, number, $###,###.00}">
                          <apex:param value="{!line.TotalPrice}" />
                        </apex:outputText>
                    </td>
                </tr>
        </apex:repeat>
    <tr><td height="50px" colspan="3" class="LineItemCell" >&nbsp;</td>
        <td class="LineItemCell" style="border-bottom:1px gray solid;">&nbsp;</td>
        <td class="TotalColRow" style="border-bottom:1px gray solid;">&nbsp;</td>
    </tr>
    <tr>
        <td colspan="3" class="LineItemCell" >&nbsp;</td>
        <td class="LineItemCell" style="border-bottom:1px gray solid;" >Grand Total</td>
        <td class="TotalColRow" style="border-bottom:1px gray solid;">
            <apex:outputText value="{0, number, $###,###.00}">
                <apex:param value="{!Opportunity.Amount}" />
            </apex:outputText>
        </td>
    </tr>
    <tr><td colspan="5" align="left" style="padding: 10px 50px 5px 50px;"><div id="commentBox2">{!Opportunity.Quote_Comments__c}</div></td></tr>
</table>
</apex:outputPanel>
<apex:outputPanel layout="block" styleClass="LineItems" rendered="{!IF(OR(contains(Opportunity.RecordType.Name,'Special Service'),contains(Opportunity.RecordType.Name,'Addendum')),'TRUE','FALSE')}">
 <table class="LineItemsTable" cellpadding="5" cellspacing="0">
        <thead>
            <tr class="LineItemHeader">
                <td style="text-align:left;width:5%;">Service</td>
                <td style="text-align:left;width:65%;">Description</td>
                <td style="width:15%;">Sales Price</td>
                <td style="width:15%;"class="TotalColHeader">Total Price</td>
            </tr>
        </thead>
        <apex:repeat var="line" value="{!Opportunity.OpportunityLineItems}" >
                <tr>
                    <td class="LineItemCell" style="text-align:center;border-bottom:1px silver solid;border-left:1px silver solid;">{!line.PricebookEntry.Name}</td>
                    <td class="LineItemCell" style="text-align:left;border-bottom:1px silver solid;">{!line.Description}</td>
                    <td class="LineItemCell" style="border-bottom:1px silver solid;"><apex:outputText value="{0, number, $###,###.00}">
                          <apex:param value="{!line.UnitPrice}" />
                        </apex:outputText>
                    </td>
                    <td class="TotalColRow" style="border-bottom:1px silver solid;"><apex:outputText value="{0, number, $###,###.00}">
                          <apex:param value="{!line.TotalPrice}" />
                        </apex:outputText>
                    </td>
                </tr>
        </apex:repeat>
    <tr><td height="50px" colspan="2" class="LineItemCell" >&nbsp;</td>
        <td class="LineItemCell" style="border-bottom:1px gray solid;">&nbsp;</td>
        <td class="TotalColRow" style="border-bottom:1px gray solid;">&nbsp;</td>
    </tr>
    <tr>
        <td colspan="2" class="LineItemCell" >&nbsp;</td>
        <td class="LineItemCell" style="border-bottom:1px gray solid;" >Grand Total</td>
        <td class="TotalColRow" style="border-bottom:1px gray solid;">
            <apex:outputText value="{0, number, $###,###.00}">
                <apex:param value="{!Opportunity.Amount}" />
            </apex:outputText>
        </td>
    </tr>
    <tr><td colspan="5" align="left" style="padding: 10px 50px 5px 50px;"><div id="commentBox2">{!Opportunity.Quote_Comments__c}</div></td></tr>
</table>
    <div id="commentBox">
    <apex:outputPanel rendered="{!IF(contains(Opportunity.RecordType.Name,'Addendum'),'TRUE','FALSE')}">    
        <br /><br />When signed this Quote will serve as an addendum to the original service agreement and will change the monthly billing to the above stated amount.
    </apex:outputPanel>
    </div>
</apex:outputPanel>
-->
<div id="bottomSection">
    <div id="ReturnMsg" class="rtnMsg">
    The prices, specifications and conditions are satisfactory and are hereby accepted. 
    Square Feat, Inc. is authorized to do these items as specified.  Please line out 
    and initial any line items not needed.</div>
    <div id="ApprovalBlock">
        <table class="approvalTable" cellpadding="0" cellspacing="0">
            <tr><td style="width:75px;">Approved&nbsp;By</td><td style="width:375px;height:20px;border-bottom:1px gray solid;">&nbsp;</td></tr>
            <tr><td>Date</td><td style="height:20px;border-bottom:1px gray solid;">&nbsp;</td></tr>
            <tr><td>Signature</td><td style="height:20px;border-bottom:1px gray solid;">&nbsp;</td></tr>
            <tr style="display:{!IF(OR(contains(Opportunity.RecordType.Name,'Special Service'),contains(Opportunity.RecordType.Name,'Addendum')),'visible','none')}">
            <td>{!IF(contains(Opportunity.RecordType.Name,'Addendum'),'Effective Date','')}{!IF(contains(Opportunity.RecordType.Name,'Special Service'),'Preferred Service Date','')}</td><td style="height:20px;border-bottom:1px gray solid;">&nbsp;</td></tr>
        </table>
    </div>
    <div style="align:center;">PLEASE FAX OR EMAIL BACK APPROVED {!IF(contains(Opportunity.RecordType.Name,'Addendum'),'ADDENDUM','QUOTE')} TO SCHEDULE WORK.</div>
    <br />
    <div style="align:center;font-weight:bold;">Thank you for the opportunity! Visit us on our web site at www.squarefeat.com</div>
</div>
</body>
</apex:page>

 
Best Answer chosen by Jeff_SF
Alain CabonAlain Cabon
Hi Jeff,

I use Notepad++ for expanding/collapsing all the levels like an XML file.

Your tag <apex:page> is linked with </body>

Perhaps, the tag <body> is missing (who knows ...)

User-added image

Open/closed parenthesis and open/closed tag, the nightmare of developper ... without Notepad++

Regards,

Alain

All Answers

Alain CabonAlain Cabon
Hi Jeff,

I use Notepad++ for expanding/collapsing all the levels like an XML file.

Your tag <apex:page> is linked with </body>

Perhaps, the tag <body> is missing (who knows ...)

User-added image

Open/closed parenthesis and open/closed tag, the nightmare of developper ... without Notepad++

Regards,

Alain
This was selected as the best answer
Alain CabonAlain Cabon
Good tools make good workers. (French proverb)  Les bons outils font les bons ouvriers.
Jeff_SFJeff_SF
this is the errors when trying to "quick save" the previously saved code that has been working (with no changes).  It was done several years ago in version 18.0.  Perhaps it doesn't like this code anymore?

Warning: The element type "apex:page" should be terminated by the matching end-tag "</apex:page>" in Opportunity_Quotation_PDF at line 287
Warning: The element type "body" should be terminated by the matching end-tag "</body>" in pdf_header_template at line 84