2010-01-21 2 views
6

Я создаю динамический PDF-файл в ColdFusion и имею проблему с «pagebreak». На рассматриваемой странице может быть 1 запись или до 60 + записей. Каждая запись отображается в 2 строках таблицы. Некоторые из возвращенных записей разделяются между страницами (первая строка находится в конце первой страницы, вторая строка - верхняя строка следующего).COLDFUSION: cfdocument и форсирование разметки страницы

Рекордное образец в отображаемом HTML:

<tr> 
    <td>Title</td><td>Price</td> 
    <td colspan="2">Description</td> 
</tr> 

По желанию клиента, Я пытаюсь показать = < 9 записей на странице.

Вот упрощенный вниз образец чего-то я пробовал:

<cfdocument format="PDF"> 
<cfoutput query = "sqllookup"> 
<cfset loopcount = loopcount + 1> 
<cfif loopcount EQ '9'> 
<cfdocumentitem type="pagebreak" /> 
<cfelse> 
<tr> 
    <td>#Title#</td><td>#Price#</td> 
    <td colspan="2">#Description#</td> 
</tr> 
</cfif> 
</cfoutput> 
</cfdocument> 

Это не работает, (она только скрывает 9-запись). Я пробовал несколько разных идей, и сейчас я в тупике. Я чем-то смотрю?

Заранее спасибо.

ColdFusion MX 7. (я побежал исправление для текста отсечения выпуска. http://kb2.adobe.com/cps/402/kb402093.html)

+0

Не совсем ответ, но предположение. Вы пытались закрыть тег таблицы после 9 записей и создать новую таблицу для новой страницы? Единственная проблема заключается в том, что для длинного текста вам понадобится меньше строк, для этого может потребоваться некоторый трюк Len(). – Sergii

ответ

6

Вы скрываете 9-й рекорд, потому что вы выбираете между отображением его и показывать его:

if 9th record 
    break page 
else 
    show record 
end if 

Что вы хотите больше похож:

<cfoutput query = "sqllookup"> 
    <!--- this is the 9th row, because 9 mod 9 is 0 ---> 
    <cfif not sqllookup.currentrow mod 9> 
     <cfdocumentitem type="pagebreak" /> 
    </cfif> 
    <tr> 
     <td>#Title#</td><td>#Price#</td> 
     <td colspan="2">#Description#</td> 
    </tr> 
</cfoutput> 
0

Попробуйте добавить style="page-break-inside: avoid;" к любому элементу, который вы не хотите, чтобы быть разделены между 2-х страниц ,

Например,

<tr style="page-break-inside: avoid;"> 
    <td>#Title#</td><td>#Price#</td> 
    <td colspan="2">#Description#</td> 
</tr> 
+0

Свойство CSS 'page-break-inside' CSS работает только для Opera http://www.w3schools.com/cssref/pr_print_pagebi.asp –

+1

@JonathanWilson Вопрос заключается не в рендеринге браузера, а в формате PDF с использованием CF. Я был свидетелем (2+ года назад), это правильно работает с использованием CF. – Eddie

+0

Ох. Я как-то неправильно понял это. –

1

После борьбы с этой проблемой в течение нескольких месяцев, я обнаружил, что обертывание cont с td с div (т.е. <tr><td><div>Cell Contents</div></td></tr>) предотвратит разрыв страницы внутри строки. При такой настройке разрыв страницы, который обычно разделяет строку между страницами, будет падать до строки, создавая немного лишних пробелов в конце первой страницы и помещая строку в начале следующей страницы.

Замечание о строках с несколькими ячейками: достаточно одного td-вложенного div, чтобы вызвать описанное выше поведение для всей строки.

<tr> 
    <td>Blah blah blah blah blah</td> 
    <td>Gnar gnar gnar gnar gnar</td> 
    <td><div>Soda POP soda POP soda POP</div></td> <!--- the fix ---> 
    <td>Stellar!</td> 
</tr> 
+0

В моих тестах с CF10 (хотя я считаю, что механизм CFdocument не изменился с CF8), рендеринг, кажется, держит ряды вместе, если они имеют три или четыре строчки, и разбивает их в какой-то момент. Это решение DIV работало на несколько более высоких строках - возможно, алгоритм взвешивает элементы блочного уровня и пытается свести их вместе, поэтому вложенные таблицы внутри ваших таблиц могут препятствовать разрыву страниц (ouch!) –

0

Для меня, после попытки все трюки и подсказки на форуме и т.д. - единственная вещь, которая работала в CF8 для больших блоков кода (в том числе изображений, таблиц, Div блоков и т.д.):

  • оберните нон страницы отключающая часть с

    <div>...</div>

  • но супер простой <br> после него в новой строке (в коде) , например.

    <div> ... your stuff ... </div> <br>

, что работал, черт его знает, почему ...