Как я могу сказать, что HTML-элемент ушел из нижней части страницы? - PullRequest
2 голосов
/ 20 апреля 2009

У меня есть система, которая принимает динамические данные, помещает их в HTML для разметки и затем преобразует их в PDF. Однако проблема, с которой я сталкиваюсь, заключается в том, что, если элемент становится слишком большим для оставшегося пространства страницы или выталкивает что-то еще снизу, как я могу обнаружить это и сам переместить элемент в правильное положение на следующей странице? (В настоящее время это мешает элементам нижнего колонтитула.)

Есть идеи?

Ответы [ 8 ]

1 голос
/ 20 апреля 2009

Рассматривали ли вы просто написание двух представлений для данных?

Это позволит вам решать и проблемы с PDF в версии PDF и решать любые проблемы HTML в версии HTML.

Редактировать: поскольку сам HTML не имеет реального понятия «размер страницы», кроме собственного окна просмотра (через javascript), это будет сложно.

Вы можете узнать вычисленную высоту данного элемента DOM, используя javascript:

document.getelementById("anElement").clientheight

Тогда, если вы знаете количество пикселей на данной странице, вы можете добавить разрывы строк по мере необходимости, чтобы оттолкнуть ее, если она будет слишком большой.

0 голосов
/ 19 мая 2009

Я обнаружил, что, используя элемент управления WebBrowser и проверяя свойство OffsetRectangle.Bottom рассматриваемого элемента, я могу определить, был ли он ниже верхнего колонтитула, затем мог бы сказать, переполнен ли элемент и насколько.

Спасибо за вашу помощь, парни и девушки.

0 голосов
/ 28 апреля 2009

может быть полезно рассмотреть некоторые атрибуты печати CSS, но без дополнительной информации трудно сказать

http://www.w3schools.com/Css/css_ref_print.asp

0 голосов
/ 24 апреля 2009

Я предполагаю, что у вас есть контроль над сгенерированным html и вы можете внести в него некоторые изменения. Вам нужно будет эмпирически определить точную высоту и ширину PDF. Вам также необходимо определить максимальное количество страниц PDF, которые будет заполнять HTML-страница.

Основной план состоит в том, чтобы поместить html-контент в свой собственный div и повторять этот div для любого количества страниц, которое вы, возможно, заполните. После этого каждый div будет стилизован и настроен на одну страницу, а переполнение будет скрыто (мы можем рассматривать каждый div как «окно»). У повторяющихся элементов div будет смещение их содержимого, так что другая часть содержимого будет находиться в окне. В следующем примере я предполагаю, что размеры страницы в формате pdf составляют 500 на 500 пикселей (я знаю, что это нереально), максимальное количество страниц, занимаемых содержимым, равно 3, и что ваш html-файл отображается pdf преобразователь в соответствии со стандартами.

<!DOCTYPE html>
<html>
<head>
  <title>PDF Pagination Example</title>
  <style>
    .header {background:blue; height:25px}
    .footer {background:green; height:25px}
    .window {height:500px; width:500px}
    #window1, #window2, #window3 {height:450px; overflow:hidden}
    #spacer2 {height:0; margin-top:-450px}
    #spacer3 {height:0; margin-top:-900px}
    li {font-size:30px; padding:10px}
  </style>
</head>
<body>

<div class='window'>
<div class='header'>A header</div>
  <div id='window1'>
    <ol>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
    </ol>
  </div>
<div class='footer'>A footer</div>
</div>

<div class='window'>
<div class='header'>A header</div>
  <div id='window2'>
  <div id='spacer2'></div>
    <ol>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
    </ol>
  </div>
<div class='footer'>A footer</div>
</div>

<div class='window'>
<div class='header'>A header</div>
  <div id='window3'>
  <div id='spacer3'></div>
    <ol>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
      <li>Content of variable height that may or may not overflow.</li>
    </ol>
</div>
<div class='footer'>A footer</div>
</div>

</body>
</html>

При размере шрифта 30 пикселей контент распределяется между двумя страницами. Если вы увеличите размер шрифта до 50 пикселей, содержимое будет распространяться на все три.

Последний кусочек головоломки - это немного JavaScript. Вам нужно будет написать фрагмент, который вычисляет высоту содержимого и добавляет заполнение к нижней части каждого окна, чтобы вы не получили обрезку, как в примере. Javascript должен также установить окна без содержимого для отображения: нет. Я не уверен, что это даже тот CSS, который вы ищете, поэтому я не буду работать с javascript, но я также уверен, что если вам понадобится помощь, вы можете найти ее здесь на SO:).

0 голосов
/ 22 апреля 2009

Я бы снял абсолютное позиционирование в вашем нижнем колонтитуле и просто позволил ему течь после содержимого.

Если вы отобразите его как одну большую страницу, то PDF может разбить страницу на нужную.

0 голосов
/ 22 апреля 2009

Guss: Я / мы используем библиотеки winover (wnvhtmlconvert.dll) для конвертации. Позиции не являются абсолютными (за исключением верхних и нижних колонтитулов), потому что они должны сдвигаться вниз, если элементы над ними расширяются. Все это должно быть динамичным, потому что содержимое элементов будет меняться в зависимости от пользовательского ввода. Каждый элемент может потребоваться разбить или переместить в зависимости от того, сколько свободного места имеется на «странице».

Zack: Я создаю HTML, чтобы преобразовать его в PDF, который он только что использовал для макета шаблона. HTML никогда не будет виден.

0 голосов
/ 20 апреля 2009

Исходя из вашего вопроса, я полагаю, вы используете статическое позиционирование (позиция: абсолютная) для всех элементов содержимого?

Если ваш контент прерывает элементы нижнего колонтитула в HTML, вполне возможно, что вы можете это исправить, разрешив HTML отображать нижний колонтитул под всем контентом, как это обычно делается в HTML.

Тем не менее, было бы очень полезно, если бы вы могли описать, как вы конвертируете HTML в PDF.

0 голосов
/ 20 апреля 2009

Вам придется отслеживать конкретную высоту всех элементов, даже динамических, на странице и определять, когда вам нужно вставить разрыв страницы.

...