Properties of an attachment in a LEADDocument.
function lt.Document.DocumentAttachment class lt.Document.DocumentAttachment() The Document library supports reading embedded attachments from documents such as PDF, as well as external attachments that are added manually.
For more information, refer to Document Attachments.
This example will extract the attachments embedded in a PDF file.
import { DocumentHelper } from "../../utilities/DocumentHelper";import { DocumentFactory_CheckCacheInfoExample } from "../Factory/CheckCacheInfo";export class DocumentAttachment_MainExample {private el: HTMLElement;public constructor() {lt.RasterSupport.setLicenseUri("https://demo.leadtools.com/licenses/v200/LEADTOOLSEVAL.txt", "EVAL", null);DocumentHelper.initFactory();}private urlToPdfFile = "http://localhost/images/pdf/portfolio/port1.pdf";public run(buttonID: string) {document.getElementById(buttonID).onclick = this.onRun;}onRun = () => {/*The PDF document can be one of the following:1. Normal PDF without attachments. Has one or more pages and no attachments.2. Normal PDF with attachments. Has one or more pages and one or more attachments.3. PDF Portfolio. Has a placeholder page and one or more attachments.The value of LoadDocumentOptions.loadAttachmentsMode affects loading the documents as follows:1. Normal PDF without attachments: Will not be affected.2. Normal PDF with attachments: Number of pages is not affected.Number of attachments is:LoadAttachmentsMode = none then 0LoadAttachmentsMode = asAttachments then number of attachments found in the document.3. PDF Portfolio: Number of pages is:LoadAttachmentsMode = none then 1 (the placeholder page)LoadAttachmentsMode = asAttachments then 0 (the document has no pages).Number of attachments is:LoadAttachmentsMode = none then 0LoadAttachmentsMode = asAttachments then number of attachments found in the document.*/const pdfUrl = this.urlToPdfFile; // URL to a PDF file as an input to this example// First, load the document without attachmentsconsole.log("Loading with DocumentLoadAttachmentsMode.none");const loadDocumentOptions = new lt.Document.LoadDocumentOptions();loadDocumentOptions.loadAttachmentsMode = lt.Document.DocumentLoadAttachmentsMode.none;this.loadDocument(pdfUrl, loadDocumentOptions, (doc) => {console.log("Document has " + doc.pages.count + " pages");// Find out if the document is portfolioconst isPortfolioValue = doc.metadata[lt.Document.LEADDocument.metadataKey_IsPortfolio];const isPortfolio = isPortfolioValue && isPortfolioValue.toLowerCase() === "true";console.log("isPortfolio:" + isPortfolio);// Check that everything is as expected// We should have 0 attachments since we did not instruct the toolkit to load theseif (doc.attachments.count != 0) throw new Error("Something went wrong");// We should have one or more pages regardless of whether the document is PDF portfolioif (doc.pages.count === 0) throw new Error("Something went wrong");// Next, load the document with attachmentsconsole.log("Loading with DocumentLoadAttachmentsMode.asAttachments");loadDocumentOptions.loadAttachmentsMode = lt.Document.DocumentLoadAttachmentsMode.asAttachments;this.loadDocument(pdfUrl, loadDocumentOptions, (doc) => {console.log("Document has " + doc.pages.count + " pages");// Find out if the document is portfolioconst isPortfolioValue = doc.metadata[lt.Document.LEADDocument.metadataKey_IsPortfolio];const isPortfolio = isPortfolioValue && isPortfolioValue.toLowerCase() === "true";console.log("isPortfolio:" + isPortfolio);// Check that everything is as expected// We may have 0 or more attachments depending on the fileconsole.log("Document has " + doc.attachments.count + " attachments");// We should have one or more pages unless this is PDF portfolio, then it will have 0 pagesif (isPortfolio) {if (doc.pages.count !== 0) throw new Error("Something went wrong");}// Extract all the embedded attachments into the cachethis.extractAttachments(doc, 0, () => {console.log("Example done");});});});}loadDocument = (url: string, loadDocumentOptions: lt.Document.LoadDocumentOptions, done: (doc: lt.Document.LEADDocument) => void) => {DocumentHelper.log("Loading document " + url);lt.Document.DocumentFactory.loadFromUri(url, loadDocumentOptions).done((doc) => {DocumentHelper.log("Document loaded and has cache id: " + doc.documentId);done(doc);}).fail(DocumentHelper.showServiceError);}extractAttachments = (doc: lt.Document.LEADDocument, attachmentIndex: number, done: () => void) => {if (attachmentIndex >= doc.attachments.count) {done();return;}// Show info on this attachmentconst attachment = doc.attachments.item(attachmentIndex);console.log("Attachment number " + attachment.AttachmentNumber + "file name is '" + attachment.fileName +"' and length is " + attachment.fileLength + " bytes");// Save it into the cache// Another option is to load it directly using lt.Document.DocumentFactory.loadDocumentAttachment to load it as a LEAD documentconst saveAttachmentToCacheOptions = new lt.Document.SaveAttachmentToCacheOptions();saveAttachmentToCacheOptions.attachmentNumber = attachmentIndex + 1;lt.Document.DocumentFactory.saveAttachmentToCache(doc, null, saveAttachmentToCacheOptions).done((attachmentDocumentId) => {console.log("attachment " + saveAttachmentToCacheOptions.attachmentNumber + " saved into the cache with document ID = " + attachmentDocumentId);// The attachment data can be downloaded using lt.Document.DocumentFactory.downloadDocumentData or loaded using DocumentFactory.loadFromCachethis.extractAttachments(doc, attachmentIndex + 1, done);}).fail(DocumentHelper.showServiceError);}}
export class DocumentHelper {static showServiceError = (jqXHR, statusText, errorThrown) => {alert("Error returned from service. See the console for details.");const serviceError = lt.Document.ServiceError.parseError(jqXHR, statusText, errorThrown);console.error(serviceError);}static log = (message: string, data?: any) => {const outputElement = document.getElementById("output");if (outputElement) {const time = (new Date()).toLocaleTimeString();const textElement = document.createElement("p");textElement.innerHTML = (outputElement.childElementCount + 1) + " [" + time + "]: " + message;outputElement.insertBefore(textElement, outputElement.firstChild);}if (!data)console.log(message);elseconsole.log(message, data);}static initFactory = () => {// To communicate with the DocumentsService, it must be running!// Change these parameters to match the path to the service.lt.Document.DocumentFactory.serviceHost = "http://localhost:40000";lt.Document.DocumentFactory.servicePath = "";lt.Document.DocumentFactory.serviceApiPath = "api";}}
import { DocumentHelper } from "../../utilities/DocumentHelper";import { DocumentFactory_CheckCacheInfoExample } from "../Factory/CheckCacheInfo";export class DocumentAttachment_MainExample {constructor() {lt.RasterSupport.setLicenseUri("https://demo.leadtools.com/licenses/v200/LEADTOOLSEVAL.txt", "EVAL", null);DocumentHelper.initFactory();}urlToPdfFile = "http://localhost/images/pdf/portfolio/port1.pdf";run = (buttonID) => {document.getElementById(buttonID).onclick = this.onRun;}onRun = () => {/*The PDF document can be one of the following:1. Normal PDF without attachments. Has one or more pages and no attachments.2. Normal PDF with attachments. Has one or more pages and one or more attachments.3. PDF Portfolio. Has a placeholder page and one or more attachments.The value of LoadDocumentOptions.loadAttachmentsMode affects loading the documents as follows:1. Normal PDF without attachments: Will not be affected.2. Normal PDF with attachments: Number of pages is not affected.Number of attachments is:LoadAttachmentsMode = none then 0LoadAttachmentsMode = asAttachments then number of attachments found in the document.3. PDF Portfolio: Number of pages is:LoadAttachmentsMode = none then 1 (the placeholder page)LoadAttachmentsMode = asAttachments then 0 (the document has no pages).Number of attachments is:LoadAttachmentsMode = none then 0LoadAttachmentsMode = asAttachments then number of attachments found in the document.*/const pdfUrl = this.urlToPdfFile; // URL to a PDF file as an input to this example// First, load the document without attachmentsconsole.log("Loading with DocumentLoadAttachmentsMode.none");const loadDocumentOptions = new lt.Document.LoadDocumentOptions();loadDocumentOptions.loadAttachmentsMode = lt.Document.DocumentLoadAttachmentsMode.none;this.loadDocument(pdfUrl, loadDocumentOptions, (doc) => {console.log("Document has " + doc.pages.count + " pages");// Find out if the document is portfolioconst isPortfolioValue = doc.metadata[lt.Document.LEADDocument.metadataKey_IsPortfolio];const isPortfolio = isPortfolioValue && isPortfolioValue.toLowerCase() === "true";console.log("isPortfolio:" + isPortfolio);// Check that everything is as expected// We should have 0 attachments since we did not instruct the toolkit to load theseif (doc.attachments.count != 0) throw new Error("Something went wrong");// We should have one or more pages regardless of whether the document is PDF portfolioif (doc.pages.count === 0) throw new Error("Something went wrong");// Next, load the document with attachmentsconsole.log("Loading with DocumentLoadAttachmentsMode.asAttachments");loadDocumentOptions.loadAttachmentsMode = lt.Document.DocumentLoadAttachmentsMode.asAttachments;this.loadDocument(pdfUrl, loadDocumentOptions, (doc) => {console.log("Document has " + doc.pages.count + " pages");// Find out if the document is portfolioconst isPortfolioValue = doc.metadata[lt.Document.LEADDocument.metadataKey_IsPortfolio];const isPortfolio = isPortfolioValue && isPortfolioValue.toLowerCase() === "true";console.log("isPortfolio:" + isPortfolio);// Check that everything is as expected// We may have 0 or more attachments depending on the fileconsole.log("Document has " + doc.attachments.count + " attachments");// We should have one or more pages unless this is PDF portfolio, then it will have 0 pagesif (isPortfolio) {if (doc.pages.count !== 0) throw new Error("Something went wrong");}// Extract all the embedded attachments into the cachethis.extractAttachments(doc, 0, () => {console.log("Example done");});});});}loadDocument = (url, loadDocumentOptions, done) => {DocumentHelper.log("Loading document " + url);lt.Document.DocumentFactory.loadFromUri(url, loadDocumentOptions).done((doc) => {DocumentHelper.log("Document loaded and has cache id: " + doc.documentId);done(doc);}).fail(DocumentHelper.showServiceError);}extractAttachments = (doc, attachmentIndex, done) => {if (attachmentIndex >= doc.attachments.count) {done();return;}// Show info on this attachmentconst attachment = doc.attachments.item(attachmentIndex);console.log("Attachment number " + attachment.AttachmentNumber + "file name is '" + attachment.fileName +"' and length is " + attachment.fileLength + " bytes");// Save it into the cache// Another option is to load it directly using lt.Document.DocumentFactory.loadDocumentAttachment to load it as a LEAD documentconst saveAttachmentToCacheOptions = new lt.Document.SaveAttachmentToCacheOptions();saveAttachmentToCacheOptions.attachmentNumber = attachmentIndex + 1;lt.Document.DocumentFactory.saveAttachmentToCache(doc, null, saveAttachmentToCacheOptions).done((attachmentDocumentId) => {console.log("attachment " + saveAttachmentToCacheOptions.attachmentNumber + " saved into the cache with document ID = " + attachmentDocumentId);// The attachment data can be downloaded using lt.Document.DocumentFactory.downloadDocumentData or loaded using DocumentFactory.loadFromCachethis.extractAttachments(doc, attachmentIndex + 1, done);}).fail(DocumentHelper.showServiceError);}}
export class DocumentHelper {static showServiceError = (jqXHR, statusText, errorThrown) => {alert("Error returned from service. See the console for details.");const serviceError = lt.Document.ServiceError.parseError(jqXHR, statusText, errorThrown);console.error(serviceError);}static log = (message, data) => {const outputElement = document.getElementById("output");if (outputElement) {const time = (new Date()).toLocaleTimeString();const textElement = document.createElement("p");textElement.innerHTML = (outputElement.childElementCount + 1) + " [" + time + "]: " + message;outputElement.insertBefore(textElement, outputElement.firstChild);}if (!data)console.log(message);elseconsole.log(message, data);}static initFactory = () => {// To communicate with the DocumentsService, it must be running!// Change these parameters to match the path to the service.lt.Document.DocumentFactory.serviceHost = "http://localhost:40000";lt.Document.DocumentFactory.servicePath = "";lt.Document.DocumentFactory.serviceApiPath = "api";}}
<!doctype html><html lang="en"><title>Document Example | DocumentAttachment</title><head><script src="https://code.jquery.com/jquery-2.2.4.min.js"integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script><script src="../../LT/Leadtools.js"></script><script src="../../LT/Leadtools.Controls.js"></script><script src="../../LT/Leadtools.Annotations.Engine.js"></script><script src="../../LT/Leadtools.Annotations.Designers.js"></script><script src="../../LT/Leadtools.Annotations.Rendering.Javascript.js"></script><script src="../../LT/Leadtools.Annotations.Automation.js"></script><script src="../../LT/Leadtools.ImageProcessing.Main.js"></script><script src="../../LT/Leadtools.ImageProcessing.Color.js"></script><script src="../../LT/Leadtools.ImageProcessing.Core.js"></script><script src="../../LT/Leadtools.ImageProcessing.Effects.js"></script><script src="../../LT/Leadtools.Document.js"></script><script src="../../LT/Leadtools.Document.Viewer.js"></script><link rel="stylesheet" type="text/css" href="../../css/examples.css"><!-- All demo files are bundled and appended to the window --><script src="../../bundle.js" type="text/javascript"></script></head><body><div><button type="button" id="exampleButton">Run Example</button></div><div id="output"></div><div><img id="img" /></div></body><script>window.onload = () => {const example = new window.examples.DocumentAttachment.Main();example.run("exampleButton");};</script></html>
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document
