Дополнительная пустая страница при преобразовании HTML в PDF с использованием abcPDF

У меня есть HTML-отчет с каждой страницей печати, содержащейся в <div class="page">. Класс страницы определяется как

width: 180mm;
height: 250mm;
page-break-after: always;
background-position: centre top;
background-image: url(Images/MainBanner.png);
background-repeat: no-repeat;
padding-top: 30mm;

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

Ответ 1

У меня возникла одна и та же самая проблема. пустая страница связана с page-break-after: always; в CSS. Не только ABCpdf, но и напечатанная будет выплюнуть дополнительную страницу. Поэтому для устранения последней страницы я использовал следующий код: MyDoc.Delete(MyDoc.Page);

Однако это приводит к другой проблеме. На сервере разработки, который имеет IE 8, я получаю дополнительную пустую страницу и на производстве, где у меня есть IE6, я не получаю лишнюю пустую страницу. Поэтому я отправил по электронной почте команду поддержки в websupergoo, чтобы показать мне способ поиска пустой страницы. Идея состоит в том, чтобы перебирать PDF файл и идентифицировать все пустые страницы и удалять их с использованием вышеприведенной логики.

И второе высказывание Яккильда. Люди Websupergoo чрезвычайно полезны и оперативны в ответе. У меня возникла еще одна проблема, связанная с тем, что ABCpdf работал до 64 бит и провел почти один день, пытаясь понять это. Они предоставили мне несколько сценариев, которые я мог бы попробовать. Их поддержка была правильной на деньги, и я запустил приложение в течение нескольких минут.

Ответ 2

protected void RemoveBlankPages(Doc pdf)
{
    for (int i = pdf.PageCount; i > 0; i--)
    {
        pdf.PageNumber = i;

        //get the pdf content
        string textContent = pdf.GetText("Text");

        //delete the page if it is blank
        if (string.IsNullOrEmpty(textContent))
            pdf.Delete(pdf.Page);
    }
}

Ответ 3

Я нашел abcPDF странным и непредсказуемым. При этом может случиться, что комбинация размера страницы и разрыва страницы может быть виновником. Уменьшите высоту страницы и/или удалите разрыв страницы.

Ответ 4

Одна вещь, заслуживающая пересмотра, - это правильность вашей разметки HTML, если вы используете метод AddImageUrl. Экземпляры, в которых рендеринг PDF не соответствует ожидаемому, могут быть результатом плохой разметки, перегруженных тегов и т.д.

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

Ответ 5

Куш прав в том, что "я столкнулся с одной и той же точной проблемой: пустая страница связана с перерывом страницы: всегда, в CSS. Не только ABCpdf, но и распечатка выплевывает дополнительную страницу."

Если div имеет "перерыв страницы: всегда", IE будет буквально всегда запускать новую страницу, и если ничего не будет добавлено, он просто напечатает пустое. Firefox не работает.

abcpdf использует механизм рендеринга IE8s и, как таковая, делает пустую страницу. Для целей OP простое использование явной высоты должно решить проблему, и двигатель вставляет разрывы страниц для вас.

Я пытаюсь решить подобную проблему, где я не могу установить высоту явно, потому что иногда содержимое может занимать 2 страницы. (Каждая страница соответствует человеку, и каждый человек должен начинать на новой странице при печати). Я также отправил по электронной почте abcpdf, чтобы узнать, есть ли у них исправление для обнаружения пустой страницы, но было любопытно, знает ли кто-нибудь, как исправить основную проблему и взломать CSS-код IE8, чтобы он не печатал последнюю страницу, если она пуста. Я предполагаю, что это невозможно, но хотелось убедиться, что я не пропущу что-то очевидное.

Ответ 6

Метод AddImageURL() для ABCPDF - метод свободной привязки, который не отображает html в пределах требуемой области, которая вызывает новую пустую страницу.

попробуйте использовать метод AddImageHTML() для преобразования желаемого HTML в PDF.

Doc theDoc = new Doc();
theDoc.Page = theDoc.AddPage();

int theID = 0;
theDoc.SetInfo(0, "CheckBgImages", "1");
theDoc.SetInfo(0, "RenderDelay", "5000");
theDoc.HtmlOptions.Engine = EngineType.MSHtml;
theID = theDoc.AddImageHtml(HTML);

while (true)
{
 if (!theDoc.Chainable(theID))
                break;
            theDoc.Page = theDoc.AddPage();
            theID = theDoc.AddImageToChain(theID);
        }

        for (int i = 0; i <= theDoc.PageCount; i++)
        {
            theDoc.PageNumber = i;
            theDoc.Flatten();
        }

        theDoc.Save(HttpContext.Current.Server.MapPath(Path));
        theDoc.Clear();

Он всегда будет давать точные результаты.

Ответ 7

Чтобы избежать разрыва страницы на последней странице, я сделал что-то вроде этого, и это сработало.

Я убедился, что на последней странице не было разрыва страницы: всегда это можно сделать с помощью любых шаблонов или интерфейсных фреймворков, таких как angularJS, но для этого примера я использую шаблон для шаблонов (но любой php сделают...)

@if ($last_page)
   <div class='footer last-page'>
@else
   <div class='footer'>

а затем у меня это в моей таблице стилей

.footer {
    page-break-after:always;
}

.last-page {
    page-break-after:avoid;
}

Ответ 8

У нас была такая же проблема только в производственной среде, но не в тестовой среде. У нас был только page-brek-after, использованный в нескольких местах в html.

Исправление для первой проблемы: я обнаружил проблему, удалив атрибуты page-brek-after один за другим, и это наконец дало мне раздел DIV, где какой-то элемент вызывал разрыв страницы.

Я установил высоту каждого элемента внутри DIV, и это, наконец, исправило мою проблему, не удаляя атрибут page-break-after.

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