歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> 服務器診所:PDF自動生成專業質量輸出

服務器診所:PDF自動生成專業質量輸出

日期:2017/3/6 15:49:55   编辑:關於Unix
對於幾種類別的頂級 質量 的可顯示輸出來說,PDF 是公認的標准。盡管大多數 程序員 把它看作“桌面”技術 — 內容專家通過“另存為”操作選擇的一種格式,但是,通過 服務器 端 PDF 創建的自動化,您可以使文檔管理處理更有效。本月,Cameron 介紹用於 PDF
  對於幾種類別的頂級質量的可顯示輸出來說,PDF 是公認的標准。盡管大多數程序員把它看作“桌面”技術 — 內容專家通過“另存為”操作選擇的一種格式,但是,通過服務器端 PDF 創建的自動化,您可以使文檔管理處理更有效。本月,Cameron 介紹用於 PDF 管理和編程的 ReportLab 庫。
  
  您知道 PDF。當推銷員想要一本看上去“井井有條”的小冊子,或法律人員需要不應該更改的文檔時,他們就以可移植文檔格式(PDF)發布這些文檔。PDF 是由 Adobe Systems 定義的標准,用於以獨立於平台和設備的方式生成和顯示文檔。PDF 建立在 Adobe 的 PostScript(PS)的空前成功之上,後者於 1984 年首次發布,用於提高通過常用硬件可實現的打印精密度。原則上,PDF 有固定的外觀,在不同的 Web 浏覽器和不同的設備(包括打印機)之間保持不變;PDF 文檔的內容被“鎖定”。
  
  盡管上面的陳述嚴格來說沒有一條是正確的,但它們基本上能應付大多數用途。而且,PDF 通常很容易打印;只有純文本文檔更容易與任何特定的打印機兼容。
  
  那與您有什麼關系嗎?作為系統或服務器端程序員,您可能僅僅把 PDF 看成另一種不透明的內容類型。您的桌面用戶或文檔專家偶爾會更新您服務器上的實例,而您就象提供任何其它文件一樣提供這些文件。您會說,那就是您最大限度參與的工作。
  
  程序化的 PDF 生成
  但是,那種模型遺漏了幾個處理 PDF 的有趣的服務器端可能性。當您使 PDF 的生成自動化時,您可以開始使用軟件工程的所有技術:版本控制、抽象、專業質量的備份和回歸測試等等。程序化的 PDF 生成意味著您能夠以可管理的方式來定制可交付使用的文檔。您的組織處理 PDF 的慣例可能是:讓熟練掌握特定桌面字處理程序的某個人建立某種類似“郵件合並”的操作,使文檔輸出參數化。然而,自動化所完成的工作遠不止這些。
  
  桌面軟件供應商對這一點有部分認識。有些字處理或桌面發布軟件包具有腳本編制能力,這些能力至少在部分程度上涉及到 PDF。有些制作室創建 PostScript 圖像,並用 Ghostscript 或類似的軟件包將它們轉換成 PDF。
  
  但是,我喜愛的使 PDF 的生成自動化的方法,是使用三個被積極維護的開放源碼庫之一:ReportLab、PJ 和 PDFlib。它們都差不多,我已經有了使一些依靠各個庫的項目取得極大成功的方法。下面的參考資料中有指向所有三個庫以及幾個其它工具的鏈接。
  
  在這些工具中,ReportLab 是我目前用得最多的工具:它可以處理我使用的幾兆字節的 PDF,它采用 Python 作為腳本語言,這很適合我,它的庫包括我日常工作所需的所有功能,而且這個庫背後的 ReportLab 公司看來享有持續增長的業務。此外,可以方便地將它集成到 Python 交互式 shell 中,這有利於形成一個令人愉快的高效開發環境。本月的“服務器診所”的余下部分將舉例說明如何開始對 PDF 編程。
  
  PDF 的“Hello, world”
  盡管您可能已經在服務器上有了較好的 Python 安裝,但 Python.org 的下載頁面可以幫助您確定是否擁有最新版本。Version 2.2.1 是很好的選擇。
  
  安裝了 Python 之後,在開始 PDF 編程工作以前,您需要訪問 ReportLab 下載頁面。即使在慢的連接上,下載並安裝 Python 和 ReportLab Toolkit 最多不會超過一小時(請參閱參考資料以獲得這兩個下載的鏈接)。
  
  您的第一個應用程序的源代碼可以象下面的代碼那樣簡單:
  
  “Hello, world”頁的源代碼
     from reportlab.pdfgen import canvas
     from reportlab.lib.units import inch
  
     font = "Helvetica"
     font_size = 26
     text = "Hello, world"
     x = 5.0 * inch
     y = 8.0 * inch
     destination_file = "/tmp/first.pdf"
  
     my_canvas = canvas.Canvas(destination_file)
     my_canvas.setFont(font, font_size)
     my_canvas.drawRightString(x, y, text)
     my_canvas.save()
  
  這段代碼僅僅把標題寫在一張原本空白的紙上。盡管普通,但它暗示了新的應用領域:字體樣式和大小、內容及格式都是可編程的。當您的組織決定以 Times New Roman 而不是 Helvetica 發布時,原則上,您可以更改一個配置賦值,然後重新生成所有內容,而不必逐個打開數千個文檔,改變它們,然後把它們寫回文檔。對於其它效果也是一樣:例如,如果您希望把針對老年讀者的信息的字體擴大,應用程序可以自動完成這一點。
  
  不過,不要認為您必須開發自己的字處理程序才能完成任何有意義的工作。雖然 ReportLab 庫有足夠的廣度和深度允許這麼做,但它也支持幾個特定的快捷方式,它們極大地簡化了我的 PDF 編程。首先是 import_HTML 方法。它將有效的 HTML 源代碼轉變成 PDF 頁。我發現,對於許多應用程序,可以較方便地以 HTML 格式制作原型,獲取樣本文檔的“客戶簽字(stakeholder sign-off)”,將 HTML 生成參數化,然後用下面的方法完成實現:
  
  my_document.import_HTML(my_html_source)
  這給了我非常快速、易於維護、完全程序化的方法來將內容注入 PDF。ReportLab 的處理效率非常高,以至於我可以輕松地實時生成用於 Web 顯示的所有種類的 PDF 文檔。這使得我能夠在保持適當的視覺外觀的同時,使關鍵的金融或工程報表與最新數據完全保持同步。當然,印刷文檔享用了同樣的定制選項。
  
  合並 PDF 文檔
  第二個關鍵的庫函數是 copyPages。它將現有的 PDF 文檔附加到一個 Canvas 實例。copyPages 很方便地把幾個 PDF 文檔連接起來形成一個 PDF 文檔。
  
  對於大多數復雜效果,象其它的 PDF 工具供應商一樣,ReportLab 發放付費產品許可證。在 ReportLab 的情況中,它的 PageCatcher 產品注釋現有的 PDF 文檔、重新安排它們的頁、並針對不同的打印方法重新格式化、添加背景(包括水印)以及填充 PDF 表單。ReportLab 記錄了幾個有趣的 PageCatcher 用例。一個示例是對已完成的美國國稅局(Internal Revenue Service (IRS))表單的程序化的預處理。
  
  我發現的 ReportLab 的最後一個重要能力是其目錄(Tables of Contents)管理。在線文檔讀者覺得這些導航輔助手段很重要,Adobe 稱其為“書簽(bookmark)”或“大綱(outline)”。大多數 PDF 查看器將它們顯示為左邊窗口中的菜單。ReportLab Reference 本身就是書簽式文檔的好例子。諸如 copyPages 之類的 ReportLab 函數包括了將大綱正確導入到較大的文檔的選項或廢棄大綱的選項。
  
  結束語
  每當計算作業似乎有些單調乏味或容易出錯時 — 例如,“手工”更新文檔 — 您就應該尋找使該過程自動化的方法。如果您不能肯定這種態度能帶您走多遠,請回過頭參閱我對 Limoncelli 和 Hogan 所著書籍的評論(“服務器診所”,2002 年 5 月)。兩位作者甚至將他們書籍的草稿構造成 make 進程的輸出。盡管許多系統程序員似乎沒有意識到這一點,但 PDF 文檔的管理為自動化和抽象提供了大量機會。使用 ReportLab 庫或其它可用的支持 PDF 的工具來教服務器做您的 PDF 工作。那樣應該可以讓您把時間投入到更有價值的研究中。

Copyright © Linux教程網 All Rights Reserved