From c5917a6d27f62d51a785e33a350ed540dcc95857 Mon Sep 17 00:00:00 2001 From: Antonov548 Date: Fri, 31 May 2024 23:09:30 +0200 Subject: [PATCH] add text drawing --- src/bind.cpp | 38 ++++++++++++++++++++-- tests/unit_tests/pages.test.js | 2 +- tests/unit_tests/painter.test.js | 1 - tests/unit_tests/text.test.js | 55 ++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 tests/unit_tests/text.test.js diff --git a/src/bind.cpp b/src/bind.cpp index a7bca32..8199d07 100644 --- a/src/bind.cpp +++ b/src/bind.cpp @@ -88,7 +88,35 @@ namespace return &pages.GetPageAt(index); } + // PdfPainter + void setFont(PoDoFo::PdfPainter& painter, const PoDoFo::PdfFont& font, double size) + { + painter.TextState.SetFont(font, size); + } + + void drawText(PoDoFo::PdfPainter& painter, const std::string& text, double x, double y) + { + painter.DrawText(text, x, y); + } + // PdfPage + em::val extractText(const PoDoFo::PdfPage& page) + { + std::vector es; + page.ExtractTextTo(es); + + em::val entries{em::val::array()}; + for (const auto& e : es) + { + em::val entry{em::val::object()}; + entry.set("text", e.Text); + + entries.call("push", entry); + } + + return entries; + } + em::val rectToArray(const PoDoFo::Rect& rect) { std::array array_rect{}; @@ -134,7 +162,8 @@ EMSCRIPTEN_BINDINGS(PODOFO) ; em::class_>("Page") - .function("getRect", &getRect) + .function("getRect", &getRect) + .function("extractText", &extractText) ; em::class_("Canvas") @@ -158,6 +187,8 @@ EMSCRIPTEN_BINDINGS(PODOFO) em::class_("Painter") .constructor() .function("setCanvas", &PoDoFo::PdfPainter::SetCanvas) + .function("setFont", &setFont, em::allow_raw_pointers()) + .function("drawText", &drawText) .function("drawCircle", &PoDoFo::PdfPainter::DrawCircle) .function("finishDrawing", &PoDoFo::PdfPainter::FinishDrawing) ; @@ -170,10 +201,11 @@ EMSCRIPTEN_BINDINGS(PODOFO) .value("StrokeFillEvenOdd", PoDoFo::PdfPathDrawMode::StrokeFillEvenOdd) ; - em::function("makeBuffer", &makeBuffer); em::function("getPageSize", &getPageSize); - em::register_vector("Buffer"); + em::class_>("Buffer") + .constructor(&makeBuffer) + ; em::enum_("PageSize") .value("A0", PoDoFo::PdfPageSize::A0) diff --git a/tests/unit_tests/pages.test.js b/tests/unit_tests/pages.test.js index b4d2336..e1bb9d8 100644 --- a/tests/unit_tests/pages.test.js +++ b/tests/unit_tests/pages.test.js @@ -15,7 +15,7 @@ describe('podofo.js', () => { const pdf = document.save(); document.delete(); - const buffer = Podofo.makeBuffer(pdf); + const buffer = new Podofo.Buffer(pdf); const parsedDocument = new Podofo.Document(); parsedDocument.loadFromBuffer(buffer); diff --git a/tests/unit_tests/painter.test.js b/tests/unit_tests/painter.test.js index d2a997a..f5389d1 100644 --- a/tests/unit_tests/painter.test.js +++ b/tests/unit_tests/painter.test.js @@ -7,7 +7,6 @@ describe('podofo.js', () => { const page = document.getPages() .createPage(size); - const painter = new Podofo.Painter(); painter.setCanvas(page); painter.drawCircle(100, 500, 20, Podofo.PathDrawMode.Fill); diff --git a/tests/unit_tests/text.test.js b/tests/unit_tests/text.test.js new file mode 100644 index 0000000..21a222a --- /dev/null +++ b/tests/unit_tests/text.test.js @@ -0,0 +1,55 @@ +describe('podofo.js', () => { + it('draw text with embeded font', async () => { + const Podofo = global.Podofo; + + const document = new Podofo.Document(); + const pages = document.getPages(); + + const size = Podofo.getPageSize(Podofo.PageSize.A4, false); + const page = pages.createPage(size); + + const fonts = document.getFonts(); + const font = fonts.getDefaultFont(); + + const painter = new Podofo.Painter(); + painter.setCanvas(page); + painter.setFont(font, 10); + + const text = 'ABCDEFGHIKLMNOPQRSTVXYZ'; + painter.drawText(text, 56.69, page.getRect()[3] - 56.69); + + const text2 = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЫЭЮЯ'; + painter.drawText(text2, 56.69, 56.69); + + painter.finishDrawing(); + + const pdf = document.save(); + + painter.delete(); + document.delete(); + + const buffer = new Podofo.Buffer(pdf); + + const parsedDocument = new Podofo.Document(); + parsedDocument.loadFromBuffer(buffer); + + const parsedPages = parsedDocument.getPages(); + expect(parsedPages.getCount()).toEqual(1); + + const parsedPage = parsedPages.getPage(0); + expect(parsedPage.getRect()).toEqual(size); + + const entries = parsedPage.extractText(); + + const entry = entries.find((e) => { return e.text == text }); + expect(entry).not.toBeUndefined(); + expect(entry.text).toEqual(text); + + const entry2 = entries.find((e) => { return e.text == text2 }); + expect(entry2).not.toBeUndefined(); + expect(entry2.text).toEqual(text2); + + parsedDocument.delete(); + buffer.delete(); + }); +});