ABCpdf скопировать верхний и нижний колонтитулы
Я использую ABCpdf 9.1 x64 .Net с Coldfusion для создания PDF на основе содержимого HTML. Каждый документ PDF имеет свой верхний и нижний колонтитулы, которые генерируются как HTML с некоторым кодом Coldfusion. Верхний колонтитул идентичен для каждой страницы, где нижний колонтитул немного отличается для каждой страницы (поскольку он показывает номер страницы). Вот основная часть моего кода:
// add content
theDoc.Get_Rect().Set_String("67 80 573 742");
theContentID = theDoc.AddImageHTML(pdfContent);
while (true) {
if (!theDoc.Chainable(theContentID)) {
break;
}
theDoc.Set_Page(theDoc.AddPage());
theContentID = theDoc.AddImageToChain(theContentID);
}
// add header & footer on each page
for (i=1; i <= theDoc.Get_PageCount(); i++) {
// set page
theDoc.Set_PageNumber(i);
// HEADER
theDoc.Get_Rect().Set_String("67 755 573 809");
theDoc.AddImageHTML(headerContent);
// FOOTER
theDoc.Get_Rect().Set_String("67 0 573 65");
theDoc.AddImageHTML(replace(footerContent, "[page]", i));
}
Как видите, AddImageHTML()
метод вызывается 2 раза для каждой страницы и один раз для содержимого. Поэтому, если у меня есть контент, который создает 6 страниц, метод вызывается 13 раз. Это не идеально, потому что метод занимает много времени.
Есть ли более эффективный способ добавить верхний и нижний колонтитулы из HTML? Есть метод AddImageCopy()
но он не работает с объектами, созданными AddImageHtml()
,
Просто для понимания: Coldfusion создает методы получения и установки для доступа к свойствам.Net.
2 ответа
Если ваш HTML относительно прост и не использует CSS, вы можете настроить его на HTML-стиль и использовать
AddHtml
вместоAddImageHtml
,AddHtml
должен работать намного быстрее, чемAddImageHtml
, В качестве дополнительного преимущества вы сможете использовать ссылочные (не установленные в системе) шрифты и цвета CMYK, если это необходимо.Так как ваш заголовок идентичен на каждой странице, возможно, вы могли бы использовать
AddImageHtml
на вторичномDoc
объект, затем добавьте это как изображение на каждой странице. Это сократит количество вызовов для заголовка с одного на страницу до одного только на файл.Поскольку нижний колонтитул отличается на каждой странице, я не понимаю, как можно избежать вызова чего-либо на каждой странице.
Я использовал этот подход, когда заголовок одинаков для всех страниц
doc.PageNumber = 1;
doc.Rect.Rectangle = headerRect; //headerrect should define the rect where the header is
doc.AddImageHtml(headerHtml); //perform addimage html once
//repeat for other pages (clones the header. much faster than calling addImageHtml every time)
for (int i = 1; i <= doc.PageCount; i++)
{
doc.PageNumber = i;
doc.AddImageDoc(doc, 1, doc.Rect);
}