Skip to content

Commit

Permalink
add text drawing
Browse files Browse the repository at this point in the history
  • Loading branch information
Antonov548 committed May 31, 2024
1 parent 2a1a37f commit c5917a6
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 5 deletions.
38 changes: 35 additions & 3 deletions src/bind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<PoDoFo::PdfTextEntry> 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<void>("push", entry);
}

return entries;
}

em::val rectToArray(const PoDoFo::Rect& rect)
{
std::array<double, 4> array_rect{};
Expand Down Expand Up @@ -134,7 +162,8 @@ EMSCRIPTEN_BINDINGS(PODOFO)
;

em::class_<PoDoFo::PdfPage, em::base<PoDoFo::PdfCanvas>>("Page")
.function("getRect", &getRect)
.function("getRect", &getRect)
.function("extractText", &extractText)
;

em::class_<PoDoFo::PdfCanvas>("Canvas")
Expand All @@ -158,6 +187,8 @@ EMSCRIPTEN_BINDINGS(PODOFO)
em::class_<PoDoFo::PdfPainter>("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)
;
Expand All @@ -170,10 +201,11 @@ EMSCRIPTEN_BINDINGS(PODOFO)
.value("StrokeFillEvenOdd", PoDoFo::PdfPathDrawMode::StrokeFillEvenOdd)
;

em::function("makeBuffer", &makeBuffer);
em::function("getPageSize", &getPageSize);

em::register_vector<char>("Buffer");
em::class_<std::vector<char>>("Buffer")
.constructor(&makeBuffer)
;

em::enum_<PoDoFo::PdfPageSize>("PageSize")
.value("A0", PoDoFo::PdfPageSize::A0)
Expand Down
2 changes: 1 addition & 1 deletion tests/unit_tests/pages.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
1 change: 0 additions & 1 deletion tests/unit_tests/painter.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
55 changes: 55 additions & 0 deletions tests/unit_tests/text.test.js
Original file line number Diff line number Diff line change
@@ -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();
});
});

0 comments on commit c5917a6

Please sign in to comment.