處理髮票
當業務蓬勃發展時,這是件好事,但當準備所有這些發票時,生產率就會下降。 手動生成發票非常耗時,而且您會面臨出錯、可能賠錢或用不正確的金額激怒客戶的風險。
例如,請考慮Danielle在醫療用品公司會計部 工作。 這是月底,所以她從幾個不同的系統中提取資訊,重複檢查其準確性,並格式化發票。 在完成了所有這些工作後,她終於準備好將文檔轉換為PDF(這樣,任何人都可以在不購買特定軟體的情況下查看文檔),並向每個客戶發送其個性化發票。
即使每月開具發票完成,丹妮爾也無法逃過這些發票。 有些客戶有每月的帳單週期,因此她總是為某人建立發票。 偶爾,客戶會編輯發票並支付低額費用。 丹妮爾則花時間解決發票不匹配問題。 這樣,她就需要請個助理來跟上所有的工作!
丹妮爾需要的是一種快速、準確地生成發票的方法,不管是在月底批發,還是在其他時候臨時生成。 理想情況下,如果她能夠保護這些發票不受編輯,她就不必擔心對不匹配的金額進行故障排除。
你能學到的
在本實踐教程中,瞭解如何使用Adobe文檔生成API自動生成發票、對PDF進行密碼保護,以及將發票交付給每個客戶。 只需對Node.js、JavaScript、Express.js、HTML和CSS稍加瞭解即可。
此項目的完整代碼是,可在GitHub上使用。 必須使用模板和原始資料資料夾設定公共目錄。 在生產中,必須從外部API獲取資料。 您還可以瀏覽包含模板資源的應用程式的此存檔版本。
相關API和資源
準備資料
本教程不介紹如何從資料倉庫導入資料。 您的客戶訂單可能存在於資料庫、外部API或自定義軟體中。 Adobe文檔生成API需要包含開票資料的JSON文檔,例如來自您的客戶關係管理(CRM)或電子商務平台的資訊。 本教程假定資料已採用JSON格式。
為簡單起見,請使用以下JSON結構進行開票:
{
"customerName": "John Doe",
"customerEmail": "john-doe@example.com",
"order": [
{
"productId": 26,
"productTitle": "Bandages",
"price": 15.82
},
{
"productId": 54,
"productTitle": "Masks",
"price": 25
},
{
"productId": 76,
"productTitle": "Gloves",
"price": 7.59
}
]
}
JSON文檔包含客戶詳細資訊和訂單資訊。 使用此結構化文檔可生成發票並以PDF格式顯示要素。
生成發票模板
Adobe文檔生成API需要基於MicrosoftWord的模板和JSON文檔來建立動態PDF或Word文檔。 為開票應用程式建立MicrosoftWord模板,並使用免費文檔生成標籤載入項生成模板標籤。 安裝載入項並在MicrosoftWord中開啟頁籤。
將JSON內容貼上到載入項後,按一下「生成標籤」。 現在,此插件顯示了對象的格式。 您的基本模板可以使用客戶的姓名和電子郵件,但不顯示訂單資訊。 本教程的後面將討論訂單資訊。
在您的MicrosoftWord文檔中,開始編寫發票模板。 將游標保留在必須插入動態資料的位置,然後從「Adobe」載入項窗口中選擇標籤。 按一下插入文本,以便Adobe文檔生成標籤載入項可以生成和插入標籤。 要個性化,請插入客戶的姓名和電子郵件。
現在,轉到每張新發票都會更改的資料。 選擇載入項的 高級 頁籤。 要查看根據客戶訂購的產品生成動態表的可用選項,請按一下表和清單。
從第一個下拉清單中選擇訂單。 在第二個下拉清單中,選擇此表的列。 在本教程中,為對象選擇所有三列以呈現表。
文檔生成API還可以執行複雜操作,如在陣列內聚合元素。 在 高級 頁籤中,選擇數值計算,在 聚合 頁籤中,選擇要應用計算的欄位。
按一下 插入計算 按鈕,在文檔中需要的位置插入此標籤。 以下文本現在出現在您的MicrosoftWord檔案中:
此發票示例包含客戶資訊、訂購產品和到期總額。
使用Adobe單據生成API生成發票
使用Adobe PDF服務Node.js軟體開發工具包(SDK)將MicrosoftWord和JSON文檔組合起來。 生成Node.js應用程式,以使用文檔生成API建立發票。
PDF服務API包括文檔生成服務,因此您可以對兩者使用相同的憑據。 享受6個月免費試用,然後每個文檔交易僅支付0.05美元。
下面是要合併PDF的代碼:
async function compileDocFile(json, inputFile, outputPdf) {
try {
// configurations
const credentials = adobe.Credentials
.serviceAccountCredentialsBuilder()
.fromFile("./src/pdftools-api-credentials.json")
.build();
// Capture the credential from app and show create the context
const executionContext = adobe.ExecutionContext.create(credentials);
// create the operation
const documentMerge = adobe.DocumentMerge,
documentMergeOptions = documentMerge.options,
options = new documentMergeOptions.DocumentMergeOptions(json, documentMergeOptions.OutputFormat.PDF);
const operation = documentMerge.Operation.createNew(options);
// Pass the content as input (stream)
const input = adobe.FileRef.createFromLocalFile(inputFile);
operation.setInput(input);
// Async create the PDF
let result = await operation.execute(executionContext);
await result.saveAsFile(outputPdf);
} catch (err) {
console.log('Exception encountered while executing operation', err);
}
}
此代碼從輸入JSON文檔和輸入模板檔案獲取資訊。 然後,建立文檔合併操作,將檔案合併到單個PDF報告中。 最後,它使用您的API憑據執行操作。 如果您尚未擁有這些憑據,將建立憑據(文檔生成和PDF服務API使用相同的憑據)。
在Express路由器內使用此代碼處理文檔請求:
// Create one report and send it back
try {
console.log(\`[INFO] generating the report...\`);
const fileContent = fs.readFileSync(\`./public/documents/raw/\${vendor}\`,
'utf-8');
const parsedObject = JSON.parse(fileContent);
await pdf.compileDocFile(parsedObject,
\`./public/documents/template/Adobe-Invoice-Sample.docx\`,
\`./public/documents/processed/output.pdf\`);
await pdf.applyPassword("p@55w0rd", './public/documents/processed/output.pdf',
'./public/documents/processed/output-secured.pdf');
console.log(\`[INFO] sending the report...\`);
res.status(200).render("preview", { page: 'invoice', filename: 'output.pdf' });
} catch(error) {
console.log(\`[ERROR] \${JSON.stringify(error)}\`);
res.status(500).render("crash", { error: error });
}
一旦執行該代碼,它就基於所提供的資料提供包含動態生成的發票的PDF文檔。 對於示例JSON資料(上面提供),此代碼的輸出為:
此發票包括JSON文檔中的動態資料。
密碼保護髮票
由於會計擔心客戶更改發票,因此請應用密碼以限制編輯。 PDF服務API可以自動將密碼應用於文檔。 在此,您使用Adobe PDF服務SDK使用密碼保護文檔。 代碼為:
async function applyPassword(password, inputFile, outputFile) {
try {
// Initial setup, create credentials instance.
const credentials = adobe.Credentials
.serviceAccountCredentialsBuilder()
.fromFile("./src/pdftools-api-credentials.json")
.build();
// Create an ExecutionContext using credentials
const executionContext = adobe.ExecutionContext.create(credentials);
// Create new permissions instance and add the required permissions
const protectPDF = adobe.ProtectPDF,
protectPDFOptions = protectPDF.options;
// Build ProtectPDF options by setting an Owner/Permissions Password, Permissions,
// Encryption Algorithm (used for encrypting the PDF file) and specifying the type of content to encrypt.
const options = new protectPDFOptions.PasswordProtectOptions.Builder()
.setOwnerPassword(password)
.setEncryptionAlgorithm(protectPDFOptions.EncryptionAlgorithm.AES_256)
.build();
// Create a new operation instance.
const protectPDFOperation = protectPDF.Operation.createNew(options);
// Set operation input from a source file.
const input = adobe.FileRef.createFromLocalFile(inputFile);
protectPDFOperation.setInput(input);
// Execute the operation and Save the result to the specified location.
let result = await protectPDFOperation.execute(executionContext);
result.saveAsFile(outputFile);
} catch (err) {
console.log('Exception encountered while executing operation', err);
}
}
使用此代碼時,它會使用密碼保護您的文檔,並將新發票上載到系統。 有關如何使用此代碼或嘗試此代碼的詳細資訊,請參閱代碼示例。
發票完成後,您可能需要自動將其電子郵件發送給客戶端。 有幾種方法可以自動發送您的客戶端電子郵件。 最快的方法是使用第三方電子郵件API和幫助程式庫,如sendgrid-nodejs。 或者,如果您已經擁有訪問SMTP伺服器的權限,則可以使用nodemailer通過SMTP發送電子郵件。
後續步驟
在本實踐教程中,您建立了一個簡單的應用程式,以幫助Danielle使用開票進行記帳。 使用PDF服務API和文檔生成SDK,您使用JSON文檔中的客戶訂單資訊填充了MicrosoftWord模板,從而建立PDF發票。 然後,PDF服務API使用密碼保護服務對每個文檔進行密碼保護。
由於丹妮爾可以自動生成發票,而且不必擔心客戶編輯發票,因此她不需要聘請助理來幫助完成所有的手工工作。 她可以利用額外時間在應付帳款檔案中查找成本節約。
現在,您已看到它有多容易,您可以使用其他Adobe工具來擴展此簡單的應用,以便在您的網站上嵌入發票。 例如,這樣客戶可以隨時查看其發票或餘額。 Adobe PDF嵌入API可免費使用。 您甚至可以轉到人力資源部門或銷售部門,幫助自動化他們的協定並收集電子簽名。
若要探索所有可能性,並開始構建自己的方便應用程式,請建立一個免費Adobe Acrobat Services帳戶,以便立即開始。 享受6個月的免費試用期,然後按使用付費
在您的業務擴展中,每筆文檔交易只需0.05美元。