2012-08-21 2 views
4

Я знаю, что это было задано раньше, но решения от 2.5+ лет назад, поэтому я спрашиваю, разработал ли кто-нибудь или знает более элегантное решение проблемы с использованием CF9. Может ли кто-нибудь подтвердить, поддерживает ли CF10 правило «перерыв страницы: избегать»?cfdocument предотвращает разрывы страниц в середине ряда

How can I prevent page-break in CFDocument from occuring in middle of content?

COLDFUSION: cfdocument and forcing a pagebreak

Это довольно много, как я это делаю. Я оценил, в зависимости от того, какой тип страницы он есть, я могу поместить 9 или 11 строк данных, прежде чем вынуждать перерыв страницы. Конечно, это склонно ломаться, поэтому, если кто-нибудь знает о какой-либо эволюции решения, я был бы благодарен.

+0

Трэвис - можете ли вы связаться со мной? У меня есть дополнительный вопрос для вас. –

+0

Спасибо, я отправил электронное письмо. У меня есть идея, которая может работать в зависимости от того, сколько времени требуется для создания больших файлов. В основном, это одна страница за раз, используя cfpdf, чтобы получить количество страниц. Если число страниц> 1 снова создаст страницу, а 1 меньше строки, добавьте ее в окончательный документ. Я думаю, что много обработки, но она * должна * допускать изящные разрывы страниц. – Travis

+0

Что-то вроде этого, что мы с Адамом отработали некоторое время назад. http://stackoverflow.com/questions/3689219/scale-pdf-to-single-page – Travis

ответ

1

Я считаю, что нашел псевдо-решение. Это в основном то, что я сказал в комментариях выше. Я беру лучшее предположение и вижу, подходит ли оно, используя значение getInfo.totalPages cfpdf. Если он подходит, отлично, объедините его с окончательным документом, если он этого не сделает, попробуйте еще раз с меньшим количеством строк.

Недостатком этого способа является то, что он немного замедляет его, и вы не можете использовать некоторые из материалов, которые cfdocument упрощает, например, возиться с верхними и нижними колонтитулами. При этом часть 2 этого решения может состоять в том, чтобы записать количество строк, которые помещаются на странице в массиве, вместо слияния страниц и снова восстановить весь документ, используя cfdocument, и эти значения в качестве ограничений цикла, заставляющих разрыв страницы после , Как это, ниже решение уже мало времени, поэтому его создание снова внутри тега cfdocument может не работать на сайтах с высоким трафиком.

Ошибка обходного пути: Похоже, есть ошибка с cfdocument, которая удаляет цвета фона при сохранении документа в памяти с атрибутом name. Обходной путь заключается в удалении тега cfdocument во внешний файл. Я видел, как один программист помещал его в cfc, я нашел, что можно использовать простой cfinclude.

Я надеюсь, что кто-то найдет это полезным, и если вы знаете, как лучше это сделать, прокомментируйте.

<cfset reviewText = "Lorem ipsum dolor sit amet, + lots of characters."> 
<cfset estimatedRowsPerPage = 7> <!--- This is the max number of records you want to try on each page. The larger the gap between max and actual will slow down the process. Used to reset attemptedRowsPerPage if the value changes ---> 
<cfset attemptedRowsPerPage = estimatedRowsPerPage> <!---- number of rows attempted to add to the page ---> 
<cfset totalRowsOutput = 0><!--- this is the number of records successfully saved to the final PDF ---> 
<cfset recordCount = 20> <!--- this is the query's record count ---> 
<!--- cfpdf cannot create a file from scratch and cfdocument requires some content so a container object cannot be created without at least one page. This page will be deleted later ---> 
<cfdocument format="pdf" marginbottom=".25" margintop=".25" marginleft=".25" marginright=".25" name = "finalDocument">Delete me</cfdocument> 
<cfloop condition="totalRowsOutput lt recordCount"> 
    <!--- create what *should* be a single page document ---> 
    <cfdocument format="pdf" marginbottom=".25" margintop=".25" marginleft=".25" marginright=".25" name = "testDocument"> 
     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
     <html xmlns="http://www.w3.org/1999/xhtml"> 
      <head> 
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
      <title>A title</title> 
      </head> 
      <body> 
       <table border="1"> 
        <tr> 
         <td>Row:</td> 
         <td>Title:</td> 
         <td>Author:</td> 
         <td>Price:</td> 
         <td>Average Rating:</td> 
         <td>Reviews:</td> 
        </tr> 
        <cfoutput> 
        <cfloop from = "1" to = "#attemptedRowsPerPage#" index = "i"> 
         <tr> 
          <td> 
           #i# 
          </td> 
          <td nowrap="nowrap"> 
           #mid(reviewText,1,randRange(4,10))# 
          </td> 
          <td nowrap="nowrap"> 
           #mid(reviewText,20,randRange(8,20))# 
          </td> 
          <td> 
           $10.00 
          </td> 
          <td> 
           #randRange(1,5)# 
          </td> 
          <td> 
           #mid(reviewText,1,randRange(10,700))# 
          </td> 
         </tr> 
        </cfloop> 
        </cfoutput> 
       </table> 
      </body> 
     </html> 
    </cfdocument> 
    <!--- get the document info to see if the page count = 1 ---> 
    <cfpdf action="getinfo" source="testDocument" name="testInfo"> 
    <cfif testInfo.totalPages gt 1> 
     <!--- if the page count is greater than 1 we need to try again with one less record. ---> 
     <cfset attemptedRowsPerPage -= 1> 
    <cfelse> 
     <!--- merge the new single page to the final document ---> 
     <cfpdf action = "merge" name = "finalDocument"> 
      <cfpdfparam source="finalDocument"> 
      <cfpdfparam source="testDocument"> 
     </cfpdf> 
     <cfset totalRowsOutput += attemptedRowsPerPage> 
     <!--- if the page count = 1, we need to increment the startAttempt and reset the attemptedRowsPerPage unless attemptedRowsPerPage = recordCount ---> 
     <cfif totalRowsOutput lt recordCount> 
      <!--- don't try to output more than exist ---> 
      <cfset attemptedRowsPerPage = estimatedRowsPerPage+totalRowsOutput lt recordCount ? estimatedRowsPerPage : recordCount-totalRowsOutput> 
     </cfif> 
    </cfif> 
</cfloop> 
<!--- delete the manditory page needed to create our final document ---> 
<cfpdf action="deletePages" pages="1" source="finalDocument" name="finalDocument"> 
<!--- see "http://www.raymondcamden.com/index.cfm/2007/7/12/ColdFusion-8-Working-with-PDFs--A-Problem" to see why you need toBinary ---> 
<cfcontent type="application/pdf" variable="#toBinary(finalDocument)#"> 
0

Трэвис - Я не знаю другого способа сделать это. Обычно я создаю таблицу HTML как ядро ​​каждой «страницы» и имею определенное количество строк, прежде чем закрыть таблицу, сломать страницу и открыть новую таблицу.

Смежные вопросы