Дополнительная пустая страница при конвертации HTML в PDF с помощью abcPDF - PullRequest
10 голосов
/ 04 марта 2010

У меня есть отчет в формате 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, внезапно после каждой реальной страницы отчета вставляется пустая страница. Я не хочу откатывать изменения, которые я только что внес, чтобы устранить эту проблему, поэтому я надеюсь, что кто-то может знать, почему вставляются дополнительные страницы.

Ответы [ 8 ]

7 голосов
/ 16 марта 2010

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

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

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

3 голосов
/ 07 сентября 2012
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);
    }
}
2 голосов
/ 11 марта 2010

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

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

2 голосов
/ 04 марта 2010

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

0 голосов
/ 10 декабря 2018

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

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

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

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

0 голосов
/ 06 января 2015

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

Я убедился, что на последней странице не было разрыва страницы: всегда, это можно сделать с помощью любой шаблонной или интерфейсной среды, такой как 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;
}
0 голосов
/ 16 июля 2012

Метод 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();

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

0 голосов
/ 30 апреля 2010

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

Если у div есть «page-break-after: всегда», IE будет буквально всегда начинать новую страницу, и если ничего не будет добавлено, он будет просто печататься пустым. Firefox не делает.

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

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

...