Я пытаюсь сгенерировать PDF, используя библиотека libHARU в сочетании с Wt Web Toolkit. Я пытаюсь создать пример кода, который они предоставляют в своей галерее Wt Widget (Wt PDF Renderer) который экспортирует PDF из XHTML.
Я компилирую с использованием g ++ (Ubuntu / Linaro 4.6.3-1ubuntu5) 4.6.3 без Возможности C ++ 11 включены.
Ниже приведен пример кода, который является прямой копией того, что находится на их сайте.
Ошибка, которую я получаю, заключается в следующем:
In function `ReportResource::renderPdf(Wt::WString const&, _HPDF_Doc_Rec*)':
undefined reference to `Wt::Render::WPdfRenderer::WPdfRenderer(_HPDF_Doc_Rec*, _HPDF_Dict_Rec*)'
undefined reference to `Wt::Render::WPdfRenderer::setMargin(double, Wt::WFlags<Wt::Side>)'
undefined reference to `Wt::Render::WPdfRenderer::setDpi(int)'
undefined reference to `Wt::Render::WPdfRenderer::~WPdfRenderer()'
undefined reference to `Wt::Render::WPdfRenderer::~WPdfRenderer()'
Я не понимаю причину этой ошибки, так как я собрал библиотеку libHARU и связал ее с моим проектом. Так же, как проверка работоспособности — я могу щелкнуть правой кнопкой мыши на Wt::Render::WPdfRenderer::WPdfRenderer
и откройте объявление (если вы знакомы с Eclipse IDE), и Eclipse перенесет меня прямо в файл заголовка для этого класса. Что является причиной «неопределенных ошибок ссылок»?
namespace {
void error_handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void *user_data) {
fprintf(stderr, "libharu error: error_no=%04X, detail_no=%d\n",
(unsigned int) error_no, (int) detail_no);
}
}
class ReportResource : public Wt::WResource
{
public:
ReportResource(Wt::WObject *parent = 0)
: Wt::WResource(parent)
{
suggestFileName("cycle-times.pdf");
}
virtual void handleRequest(const Wt::Http::Request& request,
Wt::Http::Response& response)
{
response.setMimeType("application/pdf");
HPDF_Doc pdf = HPDF_New(error_handler, 0);
// Note: UTF-8 encoding (for TrueType fonts) is only available since libharu 2.3.0 !
HPDF_UseUTFEncodings(pdf);
renderReport(pdf);
HPDF_SaveToStream(pdf);
unsigned int size = HPDF_GetStreamSize(pdf);
HPDF_BYTE *buf = new HPDF_BYTE[size];
HPDF_ReadFromStream (pdf, buf, &size);
HPDF_Free(pdf);
response.out().write((char*)buf, size);
delete[] buf;
}
private:
void renderReport(HPDF_Doc pdf) {
renderPdf(Wt::WString::tr("report.example"), pdf);
}
void renderPdf(const Wt::WString& html, HPDF_Doc pdf)
{
HPDF_Page page = HPDF_AddPage(pdf);
HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT);
Wt::Render::WPdfRenderer renderer(pdf, page);
renderer.setMargin(2.54);
renderer.setDpi(96);
renderer.render(html);
}
};
PDF генерируется с использованием библиотеки Haru Free PDF, и этот класс включается в библиотеку, только если libharu был найден во время сборки библиотеки.
Любой, кто найдет этот вопрос, должен сначала собрать libharu, а затем рассказать об этом cmake, прежде чем собирать Wt следующим образом:
cmake ../ -DHARU_PREFIX=/path/to/libharu
Если libharu не собран или не может быть найден, вы увидите сообщение об ошибке в выводе cmake, похожее на это:
libharu libraries not found - set HARU_PREFIX after running cmake ../
Других решений пока нет …