Skip to content

Commit

Permalink
add initial sign function
Browse files Browse the repository at this point in the history
  • Loading branch information
Antonov548 committed Jul 4, 2024
1 parent b438904 commit b1b9e09
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 0 deletions.
1 change: 1 addition & 0 deletions npm/podofo.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ declare module 'podofo.js' {
export interface Page extends Canvas {
getRect: () => Array<number>;
extractText: () => Array<{text: string}>;
sign: (image: Image, rect: Array<number>, certificate: Uint8Array, privateKey: Uint8Array) => Uint8ClampedArray;
}

export interface PageCollection {
Expand Down
37 changes: 37 additions & 0 deletions src/bind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,42 @@ em::val getPageSize(const PoDoFo::PdfPageSize& page_size,
PoDoFo::PdfPage::CreateStandardPageSize(page_size, landscape)};
return rectToArray(size);
}

em::val sign(PoDoFo::PdfPage& page, const PoDoFo::PdfImage& image, em::val jrect, em::val certificate, em::val key)
{
const auto& rect{vecFromJSArray<double>(jrect)};

const auto certificate_buffer{vecFromJSArray<uint8_t>(certificate)};
const auto key_buffer{vecFromJSArray<uint8_t>(key)};

auto& signature = page.CreateField<PoDoFo::PdfSignature>("Signature", PoDoFo::Rect(rect[0], rect[1], rect[2], rect[3]));
signature.SetSignatureDate(PoDoFo::PdfDate::LocalNow());

auto form{page.GetDocument().CreateXObjectForm(PoDoFo::Rect(0, 0, image.GetWidth(), image.GetHeight()))};

PoDoFo::PdfPainter painter;
painter.SetCanvas(*form);
painter.DrawImage(image, 0, 0, 1, 1);
painter.FinishDrawing();

std::vector<char> buffer;
PoDoFo::VectorStreamDevice output{buffer};

PoDoFo::PdfSignerCms signer(
{reinterpret_cast<const char*>(certificate_buffer.data()), certificate_buffer.size()},
{reinterpret_cast<const char*>(key_buffer.data()), key_buffer.size()}
);

signature.SetAppearanceStream(*form);

PoDoFo::SignDocument(static_cast<PoDoFo::PdfMemDocument&>(page.GetDocument()), output, signer, signature, PoDoFo::PdfSaveOptions::SaveOnSigning);

const auto Uint8ClampedArray{em::val::global("Uint8ClampedArray")};

return Uint8ClampedArray.new_(em::typed_memory_view(
buffer.size(), reinterpret_cast<const uint8_t*>(buffer.data())));
}

} // namespace Page

namespace Resources
Expand Down Expand Up @@ -309,6 +345,7 @@ EMSCRIPTEN_BINDINGS(PODOFO)
.function("getRect", &Page::getRect)
.function("extractText", &Page::extractText)
.function("getResources", &Page::getResources, em::allow_raw_pointers())
.function("sign", &Page::sign)
;

em::class_<PoDoFo::PdfCanvas>("Canvas")
Expand Down
Binary file added tests/test_data/certificate.der
Binary file not shown.
Binary file added tests/test_data/private_key.der
Binary file not shown.
34 changes: 34 additions & 0 deletions tests/unit_tests/sign.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
const { readFile, writeFile } = require("./utils");

describe('podofo.js', () => {
it('sign pdf document', 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 = 'Signed document';
painter.drawText(text, 56.69, page.getRect()[3] - 56.69);
painter.finishDrawing();

const buffer = readFile('image.png');

const image = new Podofo.Image(document);
image.loadFromBuffer(buffer);

const certificate = readFile('certificate.der');
const key = readFile('private_key.der');

page.sign(image, [20, 20, 100, 100], certificate, key);
});
});

0 comments on commit b1b9e09

Please sign in to comment.