1

I have a requirement where products list will be displayed in pdf. products list may vary depending upon some condition. i dnt want a single page break in my pdf, want to generate pdf in single page. i tried with css and div with style as "page-break-inside:avoid" but no luck :(

Any help will be appreciated.

below is my code

<apex:page renderAs="pdf" standardController="SFA_Customer_Activity_Report__c" extensions="SFA_PL_FOC_Document_Ext" cache="false" applyHtmlTag="false" applyBodyTag="false" standardStylesheets="false" showHeader="false" sidebar="false">
<head>
    <style>
    body { font-family: 'Times New Roman'; font-size : 13px;}
    @page{ 
    size: A4;
    margin-top: -10px; 
    margin-left: 30px; 
    margin-right: 30px; 
    margin-bottom: 15px;
    box-sizing: border-box; 
}    
   .tableHeader
   {
    border-style: inset;
    border: 1px black;
   }
    .boxed {
    width: 100px;
    align: right;
    padding: 25px;
    border-radius: 15px;
    border: 1px gray;
    margin: 25px;
    border-style: inset;
    }

    .BigBox
    {
    width: 100%;
    float: left;
    height: 100%;
    padding: 0px;
    align:left;
    margin-left: 0;
    margin-top: 0;    
    border-radius: 15px;
    border: 1px gray;
    margin-left: 0;
    border-style: inset;
    }

    .smallBox
    {
    width: 280px;
    height:3px;
    float: left;
    padding: 25px;
    align:left;
    border-radius: 15px;
    border: 1px gray;
    margin-left: 0;
    margin-top: 0;
    border-style: inset;
    }
    .tinyBox1
    {
    width: 70px;
    height:3px;
    float: left;
    padding: 25px;
    align:left;
    border-radius: 15px;
    border: 1px gray;
    margin-left: 0;
    margin-top: 0;
    border-style: inset;
    }
    .tinyBox2
    {
    width: 150px;
    height:3px;
    float: right;
    padding: 25px;
    align:left;
    border-radius: 15px;
    border: 1px gray;
    margin-left: 0;
    margin-top: 0;
    border-style: inset;
    }
    .myBigBox
    {
    width: 80px;
    padding: 25px;
    align:left;
    border: 1px gray;
    border-style: inset;
    }
    .smallBox2
    {
    padding: 25px;
    align:left;
    border-radius: 15px;
    border: 1px gray;
    border-style: inset;
    }
    .smallBox3
    {

    height:180px;
    padding: 25px;
    align:left;
    border-radius: 15px;
    border: 1px gray;
    border-style: inset;
    }
    .smallBox4
    {

    height:50px;
    padding: 25px;
    align:left;
    border-radius: 15px;
    border: 1px gray;
    border-style: inset;
    }
    .middleBox
    {
    width: 30%;
    height:1700px;
    padding: 25px;
    align:right;
    border-radius: 15px;
    border: 1px gray;
    border-style: inset;
    }

    .dataTableHeader
    {
    border: 0.5px black;
    border-style: inset;
    }



    </style>
    </head>
    <apex:form >

    <div style="width:100%;height:100px;" >
    <table>
    <tr width="100px">

    <td width="10px">
    <div style="float:left;width: 100px;height:65px;"><apex:image id="theImage" value="{!$Resource.AbbottPDFLogo}" width="70" height="45"/></div>
    </td>

    <td width="50px">
    <div style="width: 300px;margin-top:0px;margin-left:-20px;"><p style="font-size:20px;">Potwierdzenie Odbioru Produktów</p></div>
    </td>

    <td width="30px">
    <div class="boxed" style="float:right">
    {!SFA_Customer_Activity_Report__c.Contact__r.SFA_Contact_Auto_Number__c}
    </div>
    </td>

    </tr>
    </table>
    </div>

    <p>
    Przyjmuję do wiadomości, że celem przekazania Produktów jest zapoznanie Diabetyków z zasadami działania i posługiwania się Produktami (celem określonym
    poniżej). Osoba poświadczająca odbiór nie będzie czerpać korzyści finansowych z dystrybucji produktów przekazanych przez Abbott oraz nie
    będzie otrzymywała od Abbott żadnego wynagrodzenia z tego tytułu. Każde przekazanie produktów z Abbott musi być potwierdzone czytelnym podpisem
    oraz pieczątką na liście przewozowym (w przypadku dostawy za pomocą firmy kurierskiej) lub na druku potwierdzenia odbioru produktów w momencie
    otrzymania produktów. Niniejszym zobowiązuję się do sprawdzenia zgodności pomiędzy ilością produktów dostarczonych a ilością produktów wpisanych
    na potwierdzeniu przed podpisaniem dokumentu.
    </p>

    <p>
    Przyjmuję do wiadomości, że otrzymane przeze mnie produkty będą służyły wyłącznie opisanym niżej celom. Zobowiązuję się dołożyć należytej staranności,
    aby Diabetyk wykorzystał w ramach prezentacji glukometru ilość pasków testowych Optium Xido do badania poziomu glukozy, która umożliwi mu jedynie
    zapoznanie się z jego właściwościami i zasadami działania. Zobowiązuję się również wyrównać wszelkie szkody, jakie Abbott poniesie w razie naruszenia
    obowiązku przekazywania produktu w sposób zgodny z dyspozycją Abbott.
    </p>

    <div>Przekazane Produkty będą używane wyłącznie w celu: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - Demonstracji &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - Ewaluacji &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Szkolenia</div>
    <br/>

    <table width="100%" >
    <tr width="100%" border="1">

        <td class="myBigBox" width="50%">
                {!SFA_Customer_Activity_Report__c.Account__r.Name}

        </td>

        <td width="50%">
               <table>
                <tr>
                    <td>
                 <div class="smallBox">
                 {!SFA_Customer_Activity_Report__c.Account__r.SFA_Account_Street__c}
                 </div> 
                 </td>
                </tr>

                <tr>
                    <td>
                  <div class="smallBox"> {!SFA_Customer_Activity_Report__c.Account__r.SFA_Account_City__c}</div>         
                  </td>
                </tr>
                <tr>
                    <td>
                  <div class="tinyBox1">{!SFA_Customer_Activity_Report__c.Account__r.SFA_Account_ZIP_Code__c}</div>     
                  <div class="tinyBox2">{!SFA_Customer_Activity_Report__c.Account__r.phone}</div>       
                  </td>
                </tr>

            </table>
        </td>

    </tr>
    </table>

    <table width="100%" height="200px">
      <tr>
          <td style="width:70%">
              <p style="font-size: 100%; margin-top:0px;">
              Jednocześnie potwierdzam, że każde wcześniejsze wydanie miało ten sam charakter.
                Wyrażam zgodę na przetwarzanie moich danych osobowych zawartych w niniejszym formularzu przez Abbott Laboratories Poland Sp. z o.o. z siedzibą w Warszawie, ul. Postępu 21B w celach związanych z nabyciem produktów Abbott, w tym w szczególności w celu prowadzenia niezbędnych szkoleń, postępowania reklamacyjnego dotyczącego produktów Abbott lub postępowania w związku z incydentem medycznym. W przypadku zgłaszania reklamacji moje dane osobowe zostaną przekazane organom Państwa, które są uprawnione do otrzymania tych danych na podstawie obowiązujących przepisów prawa, w szczególności Prezesowi Urzędu Rejestracji Produktów Leczniczych, Wyrobów Medycznych i Produktów Biobójczych.
              </p>
              <table style="width:100%">
                  <tr>
                      <td style="width:80%">
                          <div style="float:left;width:20px;height:15px;margin-top:14px;"><apex:image id="checkboxImage" value="{!$Resource.UncheckedCheckbox}" width="20" height="15"/></div>
                          <p style="font-size: 100%;">
                          Wyrażam zgodę na przetwarzanie moich danych osobowych w celach marketingowych, w tym również na otrzymywanie informacji marketingowych za pomocą środków komunikacji elektronicznej.
                          <br/>
                          Jestem świadomy/-a dobrowolności podania danych, prawa dostępu do treści swoich danych oraz prawa ich poprawiania.
                          </p>
                    </td>
                    <td style="width:40%">
                        <div class="smallBox2">{!polandDateFormat}</div>
                    </td>
                </tr>
              </table>
          </td>

          <td style="width:30%;">
              <div class="smallBox3">Czytelny podpis (imię i nazwisko) lub imienna pieczątka z podpisem</div>
          </td>    
      </tr>
    </table>
    <br/>

    <apex:dataTable value="{!productList}" var="row" cellPadding="10" width="700" cellSpacing="8" headerClass="dataTableHeader">

         <apex:column headerValue="Data otrzymania produktów (miesiąc słownie)" value="{!row.polandDate}" width="150" style="text-align:left;border:0.5px solid black;"/>


          <apex:column headerValue="Nazwa i numer katalogowy produktu" width="350" style="text-align:left;border:0.5px solid black;" >

          <apex:image id="checkboxImage2" value="{!$Resource.UncheckedCheckbox}" rendered="{!row.unchecked}" width="20" height="15"/> 
          <apex:image id="checkboxImage3" value="{!$Resource.checkedCheckbox}" rendered="{!row.checked}" width="12" height="13"/>
          <apex:outputText >&nbsp; &nbsp;{!row.productName}</apex:outputText>
          </apex:column>

         <apex:column headerValue="Ilość otrzymanych nieodpłatnie produktów" value="{!row.placementInCount}" width="100" style="text-align:left;border:0.5px solid black;"/>

        <apex:column headerValue="Czytelny podpis (imię i nazwisko) lub imienna pieczątka z podpisem osoby potwierdzającej odbiór" width="100" style="text-align:left;border:0.5px solid black;"/>

     </apex:dataTable>

     <div style="width:100%;page-break-inside:avoid;page-break-before: avoid;page-break-after: avoid;">
    <table>
        <tr>
            <td>
                <p>* Szare pola wypełnia Abbott.</p>
            </td>

            <td>
                <div style="float:right;"><apex:image id="AbbottDiebetisCareLogo" value="{!$Resource.AbbottDiebetisCareLogo}" width="130" height="85"/></div>
            </td>
        </tr>


    </table>
  </div>
    </apex:form>
</apex:page>
1
  • Pretty sure you will have to calculate some sort of scale variable server side and merge it into your CSS to shrink content.
    – Adrian Larson
    Commented Sep 16, 2015 at 13:50

1 Answer 1

2

You're going to need to compose your page within a pagination controller similar to what's described in this article from the Technical Library titled Creating Professional PDF Documents with CSS and Visualforce. Once you know how many lines or how "large" your page is, you'll then be able to dynamically adjust your CSS to scale down the font sizes, page borders, padding and any other elements in your page you want to adjust as the number of lines you have increases beyond the maximum a "normal" page can hold.

Note: you may need to set different thresholds for the number of lines at which you'll incrementally begin to reduce margins, borders or other details you might otherwise not want to reduce.

One thing I'd highly recommend that you start with to help yourself out is to get away from working in pixels and convert those to percentages wherever possible for your box elements, margins, etc. That way you presumably won't need to scale those items and instead will hopefully only need to scale your font and line sizes. You may want to consider using ems for that.

You can also use @media settings which is always a good idea for PDFs. That's where you'll also want to think in terms of using points for base font sizes since the page will ultimately be printed in paper.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .