diff --git a/README.md b/README.md index 3e920a4b..34204c66 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,10 @@ XLS, XLSX, PPTX, DOC, DOCX, MobiXML, JPEG, EMF, PNG, BMP, GIF, TIFF, Text ## Read PDF Formats MHT, PCL, PS, XSLFO, MD -## Enhancements in Version 25.8 -- Implement document page resize functionality using the Pdf.Cloud API library. +## Enhancements in Version 25.9 +- Implement PDF document page crop functionality using the Pdf.Cloud API library. - A new version of Aspose.PDF Cloud was prepared using the latest version of Aspose.PDF for .NET. -## Bugs fixed in Version 25.8 -- Implement delete watermark from PDF document using the Pdf.Cloud API library. - ## Installation ### NPM diff --git a/UsesCases/Parser/parserGetFormsAsFDF.js b/UsesCases/Parser/parserGetFormsAsFDF.js new file mode 100644 index 00000000..e9ac2de5 --- /dev/null +++ b/UsesCases/Parser/parserGetFormsAsFDF.js @@ -0,0 +1,23 @@ +import { ParserHelper, pdfApi } from "./parserHelper.js"; +import path from 'node:path'; + +export {ParseExportFormsAsFDF}; + +const ParseExportFormsAsFDF = { + async export(documentName, outputFDFName, localFolder, remoteFolder) { + if ( pdfApi ) { + await ParserHelper.uploadDocument(documentName, localFolder, remoteFolder); + + const fdfPath = path.join(remoteFolder, outputFDFName) + const response = await pdfApi.putExportFieldsFromPdfToFdfInStorage( documentName, fdfPath, null, remoteFolder ); + + if (response.body.code == 200) { + console.log("ParseExportFormsAsFDF(): Pdf document '" + documentName + "' form fields successfully exported to '" + outputFDFName + "' file!"); + await ParserHelper.downloadResult(outputFDFName, localFolder, remoteFolder, ""); + } + else + console.error("ParseExportFormsAsFDF(): Unexpected error!") + + } + } +}; \ No newline at end of file diff --git a/UsesCases/Parser/parserGetFormsAsXML.js b/UsesCases/Parser/parserGetFormsAsXML.js new file mode 100644 index 00000000..bbbf8fcf --- /dev/null +++ b/UsesCases/Parser/parserGetFormsAsXML.js @@ -0,0 +1,23 @@ +import { ParserHelper, pdfApi } from "./parserHelper.js"; +import path from 'node:path'; + +export {ParseExportFormsAsXML}; + +const ParseExportFormsAsXML = { + async export(documentName, outputXMLName, localFolder, remoteFolder) { + if ( pdfApi ) { + await ParserHelper.uploadDocument(documentName, localFolder, remoteFolder); + + const xmlPath = path.join(remoteFolder, outputXMLName) + const response = await pdfApi.putExportFieldsFromPdfToXmlInStorage( documentName, xmlPath, null, remoteFolder ); + + if (response.body.code == 200) { + console.log("ParseExportFormsAsXML(): Pdf document '" + documentName + "' form fields successfully exported to '" + outputXMLName + "' file!"); + await ParserHelper.downloadResult(outputXMLName, localFolder, remoteFolder, ""); + } + else + console.error("ParseExportFormsAsXML(): Unexpected error!") + + } + } +}; \ No newline at end of file diff --git a/UsesCases/Parser/parserGetImages.js b/UsesCases/Parser/parserGetImages.js new file mode 100644 index 00000000..508fa464 --- /dev/null +++ b/UsesCases/Parser/parserGetImages.js @@ -0,0 +1,29 @@ +import { ParserHelper, pdfApi } from "./parserHelper.js"; +import fs from 'node:fs/promises'; +import path from 'node:path'; + +export {ParseExportImages}; + +const ParseExportImages = { + async export(documentName, pageNumber, localFolder, remoteFolder) { + if ( pdfApi ) { + await ParserHelper.uploadDocument(documentName, localFolder, remoteFolder); + + const response = await pdfApi.getImages( documentName, pageNumber, null, remoteFolder ); + + if (response.body.code == 200) { + + response.body.images.list.forEach(async function (image) { + const responseImage = await pdfApi.getImageExtractAsPng(documentName, image.id, null, null, null, remoteFolder); + + const filePath = path.join(localFolder, image.id + ".png"); + await fs.writeFile(filePath, responseImage.body); + console.log("Downloaded: " + filePath); + }); + } + else + console.error("ParseExportImages(): Unexpected error!") + + } + } +}; \ No newline at end of file diff --git a/UsesCases/Parser/parserGetTables.js b/UsesCases/Parser/parserGetTables.js new file mode 100644 index 00000000..11480aa5 --- /dev/null +++ b/UsesCases/Parser/parserGetTables.js @@ -0,0 +1,37 @@ +import { ParserHelper, pdfApi } from "./parserHelper.js"; +import fs from 'node:fs/promises'; +import path from 'node:path'; + +export {ParseExportTables}; + +const ParseExportTables = { + async export(documentName, localFolder, remoteFolder) { + if ( pdfApi ) { + await ParserHelper.uploadDocument(documentName, localFolder, remoteFolder); + + const response = await pdfApi.getDocumentTables( documentName, null, remoteFolder ); + + if (response.body.code == 200) { + console.log("ParseExportTables(): Tables successfully extracted!"); + + var result = "[\n"; + await Promise.all( + response.body.tables.list.map(async (table) => { + const responseTable = await pdfApi.getTable(documentName, table.id, null, remoteFolder) + .then(function(responseTable){ + result += JSON.stringify(responseTable.body.table) + ",\n\n"; + }); + }) + ); + result += "]"; + + const filePath = path.join(localFolder, "parsed_tables_output.json"); + await fs.writeFile(filePath, result); + console.log("Downloaded: " + filePath); + } + else + console.error("ParseExportTables(): Unexpected error!") + + } + } +}; \ No newline at end of file diff --git a/UsesCases/Parser/parserGetTextBoxes.js b/UsesCases/Parser/parserGetTextBoxes.js new file mode 100644 index 00000000..9bf1763e --- /dev/null +++ b/UsesCases/Parser/parserGetTextBoxes.js @@ -0,0 +1,37 @@ +import { ParserHelper, pdfApi } from "./parserHelper.js"; +import fs from 'node:fs/promises'; +import path from 'node:path'; + +export {ParseExportTextBoxes}; + +const ParseExportTextBoxes = { + async export(documentName, localFolder, remoteFolder) { + if ( pdfApi ) { + await ParserHelper.uploadDocument(documentName, localFolder, remoteFolder); + + const response = await pdfApi.getDocumentTextBoxFields( documentName, null, remoteFolder ); + + if (response.body.code == 200) { + console.log("ParseExportTextBoxes(): TextBox Fileds successfully extracted!"); + + var result = "[\n"; + await Promise.all( + response.body.fields.list.map(async (textbox) => { + const responseText = await pdfApi.getTextBoxField(documentName, textbox.fullName, null, remoteFolder) + .then(function(responseTextBox){ + result += JSON.stringify(responseTextBox.body.field) + ",\n\n"; + }); + }) + ); + result += "]"; + + const filePath = path.join(localFolder, "parsed_text_boxes_output.json"); + await fs.writeFile(filePath, result); + console.log("Downloaded: " + filePath); + } + else + console.error("ParseExportTextBoxes(): Unexpected error!") + + } + } +}; \ No newline at end of file diff --git a/UsesCases/Parser/parserHelper.js b/UsesCases/Parser/parserHelper.js new file mode 100644 index 00000000..8eb3f8f3 --- /dev/null +++ b/UsesCases/Parser/parserHelper.js @@ -0,0 +1,42 @@ +import credentials from "../../../Credentials/credentials.json" with { type: "json" }; // json-file in this format: { "id": "*****", "key": "*******" } +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { PdfApi } from "../../src/api/api.js"; + +export { configParams, pdfApi, ParserHelper }; + +const configParams = { + LOCAL_FOLDER: "C:\\Samples\\", + PDF_DOCUMENT_NAME: "sample.pdf", + REMOTE_FOLDER: 'TempPdfCloud', + + XML_OUTPUT_FILE: "output_sample.xml", + FDF_OUTPUT_FILE: "output_sample.fdf", + + PAGE_NUMBER: 1, + +}; + +const pdfApi = new PdfApi(credentials.id, credentials.key); + +const ParserHelper = { + async uploadFile (fileName, localFolder, tempFolder) { + const fileNamePath = path.join(localFolder, fileName); + const fileData = await fs.readFile(fileNamePath); + const storagePath = path.join(tempFolder, fileName); + await pdfApi.uploadFile(storagePath, fileData) + .then(() => console.log("File: '" + fileName +"' successfully uploaded.")); + }, + + async uploadDocument(document, localFolder, tempFolder) { + await this.uploadFile(document, localFolder, tempFolder) + }, + + async downloadResult(document, localFolder, tempFolder, prefix) { + const fileName = path.join(tempFolder, document); + const changedPdfData = await pdfApi.downloadFile(fileName); + const filePath = path.join(localFolder, prefix + document); + await fs.writeFile(filePath, changedPdfData.body); + console.log("Downloaded: " + filePath); + }, +}; \ No newline at end of file diff --git a/UsesCases/Parser/parserLaunch.js b/UsesCases/Parser/parserLaunch.js new file mode 100644 index 00000000..08cf405e --- /dev/null +++ b/UsesCases/Parser/parserLaunch.js @@ -0,0 +1,26 @@ +import { configParams } from "./parserHelper.js"; +import { ParseExportFormsAsXML } from "./parserGetFormsAsXML.js" +import { ParseExportFormsAsFDF } from "./parserGetFormsAsFDF.js"; +import { ParseExportImages } from "./parserGetImages.js"; +import { ParseExportTables } from "./parserGetTables.js"; +import { ParseExportTextBoxes } from "./parserGetTextBoxes.js"; + +async function main() { + try { + + await ParseExportFormsAsXML.export(configParams.PDF_DOCUMENT_NAME, configParams.XML_OUTPUT_FILE, configParams.LOCAL_FOLDER, configParams.REMOTE_FOLDER); + + await ParseExportFormsAsFDF.export(configParams.PDF_DOCUMENT_NAME, configParams.FDF_OUTPUT_FILE, configParams.LOCAL_FOLDER, configParams.REMOTE_FOLDER); + + await ParseExportImages.export(configParams.PDF_DOCUMENT_NAME, configParams.PAGE_NUMBER, configParams.LOCAL_FOLDER, configParams.REMOTE_FOLDER); + + await ParseExportTables.export(configParams.PDF_DOCUMENT_NAME, configParams.LOCAL_FOLDER, configParams.REMOTE_FOLDER); + + await ParseExportTextBoxes.export(configParams.PDF_DOCUMENT_NAME, configParams.LOCAL_FOLDER, configParams.REMOTE_FOLDER); + + } catch (error) { + console.error("Error:", error.message); + } +} + +await main(); \ No newline at end of file diff --git a/docs/PdfApi.md b/docs/PdfApi.md index 177d6373..8680d125 100644 --- a/docs/PdfApi.md +++ b/docs/PdfApi.md @@ -212,6 +212,7 @@ Method | HTTP request | Description *PdfApi* | [**postDocumentImageStamps**](PdfApi.md#postDocumentImageStamps) | **POST** /pdf/\{name}/stamps/image | Add document pages image stamps. *PdfApi* | [**postDocumentImageStampsPageSpecified**](PdfApi.md#postDocumentImageStampsPageSpecified) | **POST** /pdf/\{name}/stamps/image/pagespecified | Add document image stamps to specified pages. *PdfApi* | [**postDocumentPageNumberStamps**](PdfApi.md#postDocumentPageNumberStamps) | **POST** /pdf/\{name}/stamps/pagenumber | Add document page number stamps. +*PdfApi* | [**postDocumentPagesCrop**](PdfApi.md#postDocumentPagesCrop) | **POST** /pdf/\{name}/crop | Crop PDF document pages. *PdfApi* | [**postDocumentPagesResize**](PdfApi.md#postDocumentPagesResize) | **POST** /pdf/\{name}/resize | Rsize PDF document. *PdfApi* | [**postDocumentPagesRotate**](PdfApi.md#postDocumentPagesRotate) | **POST** /pdf/\{name}/rotate | Rotate PDF document. *PdfApi* | [**postDocumentTextFooter**](PdfApi.md#postDocumentTextFooter) | **POST** /pdf/\{name}/footer/text | Add document text footer. @@ -5239,6 +5240,31 @@ Name | Type | Description | Notes [**AsposeResponse**](AsposeResponse.md) +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +## **postDocumentPagesCrop** +> postDocumentPagesCrop(name, pages, rect, storage, folder, password) + +Crop PDF document pages. + +### Parameters +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- +**name** | **string** | The document name. | +**pages** | **string** | Comma separated list of pages and page ranges. (Example: 1,3-5,8) | +**rect** | [**Rectangle**](Rectangle.md) | Rectangle of document area. | +**storage** | **string** | The document storage. | [optional] +**folder** | **string** | The document folder. | [optional] +**password** | **string** | Base64 encoded password. | [optional] + +### Return type + +[**AsposeResponse**](AsposeResponse.md) + ### HTTP request headers - **Content-Type**: application/json diff --git a/package-lock.json b/package-lock.json index 17229a76..0a368dcb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "asposepdfcloud", - "version": "25.8.0", + "version": "25.9.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "asposepdfcloud", - "version": "25.8.0", + "version": "25.9.0", "license": "MIT", "dependencies": { "@types/bluebird": "*", diff --git a/package.json b/package.json index 5fa43b7c..7d219c6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "asposepdfcloud", - "version": "25.8.0", + "version": "25.9.0", "description": "Aspose.PDF Cloud is a REST API for creating and editing PDF files. Most popular features proposed by Aspose.PDF Cloud: PDF to Word, Convert PDF to Image, Merge PDF, Split PDF, Add Images to PDF, Rotate PDF. It can also be used to convert PDF files to different formats like DOC, HTML, XPS, TIFF and many more. Aspose.PDF Cloud gives you control: create PDFs from scratch or from HTML, XML, template, database, XPS or an image. Render PDFs to image formats such as JPEG, PNG, GIF, BMP, TIFF and many others. Aspose.PDF Cloud helps you manipulate elements of a PDF file like text, annotations, watermarks, signatures, bookmarks, stamps and so on. Its REST API also allows you to manage PDF pages by using features like merging, splitting, and inserting. Add images to a PDF file or convert PDF pages to images.", "homepage": "https://products.aspose.cloud/pdf/cloud", "author": { diff --git a/src/api/api.ts b/src/api/api.ts index 201110ab..85ab0096 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -13006,6 +13006,80 @@ export class PdfApi { } + /** + * + * @summary Crop PDF document pages. + * @param name The document name. + * @param pages Comma separated list of pages and page ranges. (Example: 1,3-5,8) + * @param rect Rectangle of document area. + * @param storage The document storage. + * @param folder The document folder. + * @param password Base64 encoded password. + */ + public async postDocumentPagesCrop (name: string, pages: string, rect: Rectangle, storage?: string, folder?: string, password?: string) : Promise<{ response: http.IncomingMessage; body: AsposeResponse; }> { + const localVarPath = this.basePath + '/pdf/{name}/crop' + .replace('{' + 'name' + '}', encodeURIComponent(String(name)).replace('%2F', '/')); + let localVarQueryParameters: any = {}; + let localVarHeaderParams: any = (Object).assign({}, this.defaultHeaders); + let localVarFormParams: any = {}; + + // verify required parameter 'name' is not null or undefined + if (name === null || name === undefined) { + throw new Error('Required parameter name was null or undefined when calling postDocumentPagesCrop.'); + } + + // verify required parameter 'pages' is not null or undefined + if (pages === null || pages === undefined) { + throw new Error('Required parameter pages was null or undefined when calling postDocumentPagesCrop.'); + } + + // verify required parameter 'rect' is not null or undefined + if (rect === null || rect === undefined) { + throw new Error('Required parameter rect was null or undefined when calling postDocumentPagesCrop.'); + } + + if (pages !== undefined && null !== pages) { + localVarQueryParameters['pages'] = ObjectSerializer.serialize(pages, "string"); + } + + if (storage !== undefined && null !== storage) { + localVarQueryParameters['storage'] = ObjectSerializer.serialize(storage, "string"); + } + + if (folder !== undefined && null !== folder) { + localVarQueryParameters['folder'] = ObjectSerializer.serialize(folder, "string"); + } + + if (password !== undefined && null !== password) { + localVarQueryParameters['password'] = ObjectSerializer.serialize(password, "string"); + } + + + let localVarUseFormData = false; + let fileData = null; + let localVarRequestOptions: localVarRequest.Options = { + method: 'POST', + qs: localVarQueryParameters, + headers: localVarHeaderParams, + uri: localVarPath, + useQuerystring: this._useQuerystring, + json: true, + body: ObjectSerializer.serialize(rect, "Rectangle") + }; + + if (Object.keys(localVarFormParams).length) { + if (localVarUseFormData) { + (localVarRequestOptions).formData = localVarFormParams; + } else { + localVarRequestOptions.form = localVarFormParams; + } + } + const response = await invokeApiMethod(localVarRequestOptions, this.configuration, false, fileData); + const result = ObjectSerializer.deserialize(response.body, "AsposeResponse"); + return Promise.resolve({body: result, response}); + } + + /** * * @summary Rsize PDF document. diff --git a/src/requestHelper.ts b/src/requestHelper.ts index d1d180aa..d807c54f 100644 --- a/src/requestHelper.ts +++ b/src/requestHelper.ts @@ -95,7 +95,7 @@ async function invokeApiMethodInternal(requestOptions: request.Options, confgura //headers sa.set("User-Agent", "pdf nodejs sdk"); sa.set("x-aspose-client", "nodejs sdk"); - sa.set("x-aspose-client-version", "25.8.0"); + sa.set("x-aspose-client-version", "25.9.0"); if (!requestOptions.headers) { requestOptions.headers = {}; diff --git a/test/testDocument.ts b/test/testDocument.ts index edfd1094..0e39d482 100644 --- a/test/testDocument.ts +++ b/test/testDocument.ts @@ -244,4 +244,13 @@ describe("Document Tests", () => { assert.equal(result.response.statusCode, 200); }); }); + + describe("PostDocumentPagesCrop Test", () => { + it("should return response with code 200", async () => { + const name = "4pages.pdf"; + await BaseTest.uploadFile(name); + const result = await BaseTest.getPdfApi().postDocumentPagesCrop(name, "2-3", { lLX: 0, lLY: 0, uRX: 800, uRY: 400 },null, BaseTest.remoteTempFolder) + assert.equal(result.response.statusCode, 200); + }); + }); });