pdfix-sdk
Version:
Take the full control over the PDF documents with PDFix SDK. Leverage the advantages of the PDFix SDK WebAssembly build for use in both Node.js and web applications
467 lines (396 loc) • 18.1 kB
text/typescript
const Pdfix = require('./index');
import {
PdfDoc,
PdfTagsParams,
PdfAccessibleParams,
PdfHtmlConversion,
PdfHtmlParams,
PsStream,
PdfAnnot,
PdfPage,
PdfRect,
PdfTextAnnot,
PdsStream,
PdsContent,
PdsDictionary,
PdfMatrix,
PdsImage,
PdfGraphicState,
PdfBookmark,
PdfTiffConversion,
PdfTiffParams,
PdsArray,
PdeWordList,
PdfixSdk,
PsMemoryStream
} from "PDFIX_WASM";
import {
PdfAuthPlatform,
PdfixEnum,
PdfHtmlType,
PdfAnnotSubtype,
PdfImageFormat,
PdfWordFinderAlgorithm
} from "./bin/node/pdfix_enums";
function streamToString(sdk: PdfixSdk, stream: PsStream): string {
const ptr: number = sdk._malloc(stream.GetSize());
stream.Read(0, ptr as any, stream.GetSize());
let string: string = '';
for (let i = 0; i < stream.GetSize(); i++) {
string += String.fromCharCode((sdk as any).HEAP8[ptr + i])
}
return string;
}
describe('PdfixTsTest', () => {
let pdfix: typeof Pdfix;
let pdfixSdk: PdfixSdk;
let pdfixVersion: Array<number> = [7, 1, 1];
beforeAll(async () => {
pdfix = new Pdfix();
await pdfix.loadPdfixSdk();
pdfixSdk = pdfix.getPdfixSdk();
});
afterAll(() => {
pdfixSdk.GetPdfix().Destroy();
});
it('should create Pdfix instance', () => {
expect(pdfix).toBeInstanceOf(Pdfix);
});
it('should check the PDFix version', () => {
const versionMajor: number = pdfixSdk.GetPdfix().GetVersionMajor();
const versionMinor: number = pdfixSdk.GetPdfix().GetVersionMinor();
const versionPatch: number = pdfixSdk.GetPdfix().GetVersionPatch();
expect(versionMajor).toBe(pdfixVersion[0]);
expect(versionMinor).toBe(pdfixVersion[1]);
expect(versionPatch).toBe(pdfixVersion[2]);
});
it('should touch enum values', () => {
expect(PdfAuthPlatform.kAuthPlatformAndroid).toBe(3);
});
it('should open a document from path', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
expect(pdfDoc).toBeDefined();
expect(pdfDoc.Close()).toBe(0);
});
it('should add Tags to PDF', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const pdfTagsParams: PdfTagsParams = new pdfixSdk.PdfTagsParams();
expect((pdfTagsParams as any).ptr).toBeTruthy();
expect(pdfDoc.AddTags(pdfTagsParams, 0, 0)).toBeTruthy();
expect(pdfDoc.Close()).toBe(0);
});
it('should make a PDF Accessible', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const pdfAccessibleParams: PdfAccessibleParams = new pdfixSdk.PdfAccessibleParams();
expect((pdfAccessibleParams as any).ptr).toBeTruthy();
let result: boolean = pdfDoc.MakeAccessible(
pdfAccessibleParams,
"Document Title",
"en-US",
0,
0
);
expect(result).toBeTruthy();
expect(pdfDoc.Close()).toBe(0);
});
it('should create PDF to HTML conversion and get document CSS', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const pdfToHtmlConversion: PdfHtmlConversion = pdfDoc.CreateHtmlConversion();
expect((pdfToHtmlConversion as any).ptr).toBeTruthy();
const stream: PsStream = pdfixSdk.GetPdfix().CreateMemStream();
expect((stream as any).ptr).toBeTruthy();
expect(pdfToHtmlConversion.SaveCSS(stream)).toBeTruthy();
const htmlString = streamToString(pdfixSdk, stream);
stream.Destroy();
pdfToHtmlConversion.Destroy();
expect(htmlString).toBeTruthy();
expect(pdfDoc.Close()).toBe(0);
});
it('should create PDF to HTML conversion and get document JavaScript', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const pdfToHtmlConversion: PdfHtmlConversion = pdfDoc.CreateHtmlConversion();
expect((pdfToHtmlConversion as any).ptr).toBeTruthy();
const stream: PsStream = pdfixSdk.GetPdfix().CreateMemStream();
expect((stream as any).ptr).toBeTruthy();
pdfToHtmlConversion.SaveJavaScript(stream);
const htmlString = streamToString(pdfixSdk, stream);
stream.Destroy();
pdfToHtmlConversion.Destroy();
expect(htmlString).toBeTruthy();
expect(pdfDoc.Close()).toBe(0);
});
it('should create PDF to HTML conversion and get document fixed HTML', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const pdfToHtmlConversion: PdfHtmlConversion = pdfDoc.CreateHtmlConversion();
expect((pdfToHtmlConversion as any).ptr).toBeTruthy();
let pdfHtmlParams: PdfHtmlParams = new pdfixSdk.PdfHtmlParams();
pdfHtmlParams.flags |= (
PdfixEnum.kHtmlNoExternalCSS |
PdfixEnum.kHtmlNoExternalJS |
PdfixEnum.kHtmlNoExternalIMG |
PdfixEnum.kHtmlNoExternalFONT |
PdfixEnum.kHtmlNoPagesNode
);
pdfHtmlParams.type = PdfHtmlType.kPdfHtmlFixed;
expect(pdfToHtmlConversion.SetParams(pdfHtmlParams)).toBeTruthy();
expect(pdfToHtmlConversion.AddPage(0, 0, 0)).toBeTruthy();
const stream: PsStream = pdfixSdk.GetPdfix().CreateMemStream();
expect((stream as any).ptr).toBeTruthy();
expect(pdfToHtmlConversion.SaveToStream(stream, 0, 0)).toBeTruthy();
const htmlString = streamToString(pdfixSdk, stream);
stream.Destroy();
pdfToHtmlConversion.Destroy();
expect(htmlString).toBeTruthy();
expect(pdfDoc.Close()).toBe(0);
});
it('should create PDF to HTML conversion and get document responsive HTML', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const pdfToHtmlConversion: PdfHtmlConversion = pdfDoc.CreateHtmlConversion();
expect((pdfToHtmlConversion as any).ptr).toBeTruthy();
let pdfHtmlParams: PdfHtmlParams = new pdfixSdk.PdfHtmlParams();
pdfHtmlParams.flags |= (
PdfixEnum.kHtmlNoExternalCSS |
PdfixEnum.kHtmlNoExternalJS |
PdfixEnum.kHtmlNoExternalIMG |
PdfixEnum.kHtmlNoExternalFONT
);
pdfHtmlParams.type = PdfHtmlType.kPdfHtmlResponsive;
expect(pdfToHtmlConversion.SetParams(pdfHtmlParams)).toBeTruthy();
expect(pdfToHtmlConversion.AddPage(1, 0, 0)).toBeTruthy();
const stream: PsStream = pdfixSdk.GetPdfix().CreateMemStream();
expect((stream as any).ptr).toBeTruthy();
expect(pdfToHtmlConversion.SaveToStream(stream, 0, 0)).toBeTruthy();
const htmlString = streamToString(pdfixSdk, stream);
stream.Destroy();
pdfToHtmlConversion.Destroy();
expect(htmlString).toBeTruthy();
expect(pdfDoc.Close()).toBe(0);
});
it('should remove & add tags, create PDF to HTML conversion and get document derived HTML', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
expect(pdfDoc.RemoveTags(0, 0)).toBeTruthy();
const pdfTagsParams: PdfTagsParams = new pdfixSdk.PdfTagsParams();
expect((pdfTagsParams as any).ptr).toBeTruthy();
expect(pdfDoc.AddTags(pdfTagsParams, 0, 0)).toBeTruthy();
const pdfToHtmlConversion: PdfHtmlConversion = pdfDoc.CreateHtmlConversion();
expect((pdfToHtmlConversion as any).ptr).toBeTruthy();
let pdfHtmlParams: PdfHtmlParams = new pdfixSdk.PdfHtmlParams();
pdfHtmlParams.flags |= (
PdfixEnum.kHtmlNoExternalCSS |
PdfixEnum.kHtmlNoExternalJS |
PdfixEnum.kHtmlNoExternalIMG |
PdfixEnum.kHtmlNoExternalFONT |
PdfixEnum.kHtmlNoPagesNode
);
pdfHtmlParams.type = PdfHtmlType.kPdfHtmlDerivation;
expect(pdfToHtmlConversion.SetParams(pdfHtmlParams)).toBeTruthy();
expect(pdfToHtmlConversion.AddPage(0, 0, 0)).toBeTruthy();
const stream: PsStream = pdfixSdk.GetPdfix().CreateMemStream();
expect((stream as any).ptr).toBeTruthy();
expect(pdfToHtmlConversion.SaveToStream(stream, 0, 0)).toBeTruthy();
const htmlString = streamToString(pdfixSdk, stream);
stream.Destroy();
pdfToHtmlConversion.Destroy();
expect(htmlString).toBeTruthy();
expect(pdfDoc.Close()).toBe(0);
});
it('should create an annotation and add it to document', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const pdfPage: PdfPage = pdfDoc.AcquirePage(0);
expect((pdfPage as any).ptr).toBeTruthy();
const rect: PdfRect = new pdfixSdk.PdfRect();
expect((rect as any).ptr).toBeTruthy();
const annot: PdfAnnot = pdfPage.CreateAnnot(PdfAnnotSubtype.kAnnotSquare, rect);
expect((annot as any).ptr).toBeTruthy();
expect(pdfPage.AddAnnot(pdfPage.GetNumAnnots(), annot)).toBeTruthy();
expect(pdfPage.Release()).toBe(0);
expect(pdfDoc.Close()).toBe(0);
});
it('should add a comment, save, open newly saved document & verify num of annots', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const pdfPage: PdfPage = pdfDoc.AcquirePage(0);
expect((pdfPage as any).ptr).toBeTruthy();
expect(pdfPage.GetNumAnnots()).toBe(3);
const rect: PdfRect = new pdfixSdk.PdfRect();
expect((rect as any).ptr).toBeTruthy();
pdfPage.GetCropBox(rect);
const annotRect: PdfRect = new pdfixSdk.PdfRect();
expect((annotRect as any).ptr).toBeTruthy();
annotRect.left = (rect.right + rect.left) / 2. - 10;
annotRect.bottom = (rect.top + rect.bottom) / 2. - 10;
annotRect.right = (rect.right + rect.left) / 2. + 10;
annotRect.top = (rect.top + rect.bottom) / 2. + 10;
const annot = pdfPage.CreateAnnot(PdfAnnotSubtype.kAnnotText, annotRect);
expect((annot as any).ptr).toBeTruthy();
expect(pdfPage.AddAnnot(pdfPage.GetNumAnnots(), annot)).toBeTruthy();
const textAnnot: PdfTextAnnot = pdfixSdk.wrapPointer((annot as any).ptr, (pdfixSdk as any).PdfMarkupAnnot);
expect(textAnnot.SetAuthor("Peter Brown")).toBeTruthy();
expect(textAnnot.SetContents("This is my comment.")).toBeTruthy();
expect(textAnnot.AddReply("Mark Fish", "This is some reply.")).toBeTruthy();
const stream: PsStream = pdfixSdk.GetPdfix().CreateMemStream();
expect(pdfDoc.SaveToStream(stream, PdfixEnum.kSaveFull)).toBeTruthy();
const arrayBuffer: ArrayBuffer = new ArrayBuffer(stream.GetSize());
(stream as any).ReadToArrayBuffer(0, arrayBuffer, arrayBuffer.byteLength);
const buffer: Buffer = Buffer.from(arrayBuffer);
const fs = require("fs");
fs.writeFileSync("./pdf/test_out.pdf", buffer);
expect(pdfPage.Release()).toBe(0);
expect(pdfDoc.Close()).toBe(0);
const pdfDocSaved: PdfDoc = pdfix.openDocumentFromPath("./pdf/test_out.pdf");
const pdfPage1: PdfPage = pdfDocSaved.AcquirePage(0);
expect(pdfPage1.GetNumAnnots()).toBe(4);
expect(pdfPage1.Release()).toBe(0);
expect(pdfDocSaved.Close()).toBe(0);
fs.unlinkSync("./pdf/test_out.pdf");
});
it('should add a watermark', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const memStream: PsMemoryStream = pdfixSdk.GetPdfix().CreateMemStream();
expect((memStream as any).ptr).toBeTruthy();
const fs = require("fs");
const fileBuffer = new Uint8Array( fs.readFileSync('./pdf/watermark.png', null).buffer );
const [buffer, size] = pdfixSdk.allocArray(fileBuffer);
memStream.Write(0, buffer as any, size);
const imageObj: PdsStream = pdfDoc.CreateXObjectFromImage(memStream, PdfImageFormat.kImageFormatPng, 0)
expect((imageObj as any).ptr).toBeTruthy();
for (let i = 0; i < pdfDoc.GetNumPages(); i++) {
const pdfPage: PdfPage = pdfDoc.AcquirePage(i);
expect((pdfPage as any).ptr).toBeTruthy();
const content: PdsContent = pdfPage.GetContent();
expect((content as any).ptr).toBeTruthy();
const xObjDict: PdsDictionary = imageObj.GetStreamDict();
expect((xObjDict as any)).toBeTruthy();
const width: number = xObjDict.GetNumber("Width");
const height: number = xObjDict.GetNumber("Height");
expect(width).toBeTruthy();
expect(height).toBeTruthy();
const pageMatrix: PdfMatrix = new pdfixSdk.PdfMatrix();
pdfPage.GetDefaultMatrix(pageMatrix);
expect((pageMatrix as any).ptr).toBeTruthy();
const cropRect: PdfRect = new pdfixSdk.PdfRect();
pdfPage.GetCropBox(cropRect);
expect((cropRect as any).ptr).toBeTruthy();
const matrix: PdfMatrix = new pdfixSdk.PdfMatrix();
expect((matrix as any).ptr).toBeTruthy();
matrix.a = width;
matrix.d = height;
const addedImageObj: PdsImage = content.AddNewImage(PdfixEnum.kInsertAfterLast, imageObj, matrix);
expect((addedImageObj as any).ptr).toBeTruthy();
const graphicState: PdfGraphicState = new pdfixSdk.PdfGraphicState();
expect((graphicState as any).ptr).toBeTruthy();
expect(addedImageObj.GetGState(graphicState)).toBeTruthy();
graphicState.color_state.fill_opacity = 0.5 * 255;
addedImageObj.SetGState(graphicState);
expect(pdfPage.SetContent()).toBeTruthy();
expect(pdfPage.Release()).toBe(0);
}
expect(pdfDoc.Close()).toBe(0);
});
it('should get bookmark root, its child, num children and title', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const bookmarkRook: PdfBookmark = pdfDoc.GetBookmarkRoot();
expect((bookmarkRook as any).ptr).toBeTruthy();
expect(bookmarkRook.GetNumChildren()).toBe(1);
const firstChild: PdfBookmark = bookmarkRook.GetChild(0);
expect((firstChild as any).ptr).toBeDefined();
expect((firstChild as any).GetTitle()).toBe("Donec quis sollicitudin odio");
expect(pdfDoc.Close()).toBe(0);
});
it('should create PDF to TIFF conversion and convert to TIFF', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const tiffConversion: PdfTiffConversion = pdfDoc.CreateTiffConversion();
expect((tiffConversion as any).ptr).toBeTruthy();
const params: PdfTiffParams = new pdfixSdk.PdfTiffParams();
expect((params as any).ptr).toBeTruthy();
expect(tiffConversion.SetParams(params)).toBeTruthy();
const stream: PsStream = pdfixSdk.GetPdfix().CreateMemStream();
expect((stream as any).ptr).toBeTruthy();
expect(tiffConversion.SaveToStream(stream, 0, 0)).toBeTruthy();
stream.Destroy();
expect(pdfDoc.Close()).toBe(0);
});
it('should create a new document', () => {
const pdfDoc: PdfDoc = pdfixSdk.GetPdfix().CreateDoc();
expect((pdfDoc as any).ptr).toBeTruthy();
const rect: PdfRect = new pdfixSdk.PdfRect();
rect.right = 595;
rect.top = 842;
const pdfPage: PdfPage = pdfDoc.CreatePage(PdfixEnum.kInsertAfterLast, rect);
expect((pdfPage as any).ptr).toBeTruthy();
expect(pdfPage.Release()).toBe(0);
expect(pdfDoc.Close()).toBe(0);
});
it('should create a redaction mark and apply redaction', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect((pdfDoc as any).ptr).toBeTruthy();
const pdfPage: PdfPage = pdfDoc.AcquirePage(0);
expect((pdfPage as any).ptr).toBeTruthy();
const rect: PdfRect = new pdfixSdk.PdfRect();
rect.left = 100;
rect.right = 200;
rect.top = 200;
rect.bottom = 100;
const redactAnnot: PdfAnnot = pdfPage.CreateAnnot(PdfAnnotSubtype.kAnnotRedact, rect);
expect((redactAnnot as any).ptr).toBeTruthy();
redactAnnot.NotifyWillChange("IC");
const obj: PdsDictionary = redactAnnot.GetObject();
expect((obj as any).ptr).toBeTruthy();
const outlineColor: PdsArray = obj.PutArray("OC");
expect((outlineColor as any).ptr).toBeTruthy();
expect(outlineColor.PutNumber(0, 1.0)).toBeTruthy();
expect(outlineColor.PutNumber(1, 0.0)).toBeTruthy();
expect(outlineColor.PutNumber(2, 0.0)).toBeTruthy();
const innerColor: PdsArray = obj.PutArray("IC");
expect((innerColor as any).ptr).toBeTruthy();
expect(innerColor.PutNumber(0, 0.0)).toBeTruthy();
expect(innerColor.PutNumber(1, 0.0)).toBeTruthy();
expect(innerColor.PutNumber(2, 0.0)).toBeTruthy();
expect(obj.PutString("DA", "1 1 0 RG 1 1 0 rg 0 Tc 0 Tw 100 Tz 0 TL 0 Ts 0 Tr /Helv 10 Tf")).toBeTruthy();
expect(obj.PutString("OverlayText", "THIS WAS REDACTED ")).toBeTruthy();
expect(obj.PutNumber("Q", 0)).toBeTruthy();
redactAnnot.NotifyDidChange("IC", 0);
expect(pdfPage.AddAnnot(PdfixEnum.kInsertAfterLast, redactAnnot)).toBeTruthy();
expect(pdfDoc.ApplyRedaction(0, 0)).toBeTruthy();
expect(pdfPage.Release()).toBe(0);
expect(pdfDoc.Close()).toBe(0);
});
it('should delete pages', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
expect(pdfDoc.DeletePages(0, 1, 0, 0)).toBeTruthy();
expect((pdfDoc as any).ptr).toBeTruthy();
expect(pdfDoc.Close()).toBe(0);
});
it('should get document metadata', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
const meta: PdsStream = pdfDoc.GetMetadata();
expect((meta as any).ptr).toBeTruthy();
expect((pdfDoc as any).GetInfo("Title")).toBe("Lorem Ipsum");
expect((pdfDoc as any).ptr).toBeTruthy();
expect(pdfDoc.Close()).toBe(0);
});
it('should get page text', () => {
const pdfDoc: PdfDoc = pdfix.openDocumentFromPath('./pdf/test.pdf');
const pdfPage: PdfPage = pdfDoc.AcquirePage(0);
expect((pdfPage as any).ptr).toBeTruthy();
const wordList: PdeWordList = pdfPage.AcquireWordList(
PdfWordFinderAlgorithm.kWordFinderAlgBasic, PdfixEnum.kWordFinderDefault);
expect((wordList as any).ptr).toBeTruthy();
expect((wordList.GetWord(0) as any).GetText()).toBe("Donec");
expect(wordList.Release()).toBe(0);
expect(pdfPage.Release()).toBe(0);
expect(pdfDoc.Close()).toBe(0);
});
});