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

у меня есть отчет HTML, с каждой страницей печати, содержащейся в <div class="page">. Класс 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, внезапно я получаю пустую страницу, вставленную после каждой реальной страницы отчета. Я не хочу откатывать изменения, которые я только что сделал, чтобы удалить эту проблему, поэтому я надеюсь, что кто-то может знать, почему вставляются дополнительные страницы.

7 ответов


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

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

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


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

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


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);
    }
}

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


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

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

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

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


на 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();

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


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

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

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

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

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

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