Дополнительная пустая страница при преобразовании 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;
}