查看單個文章
舊 2003-11-17, 12:33 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 分割/合併PDF檔

最近因有需要把一個PDF檔分割和把數個PDF合併而作了一些研究,現在寫出來給大家指教一下。

在Windows平台,有不少軟體可幫手,如ARTS Split & Merge Lite, ARTS Split Pro, Appligent Append PDF等。基本上都可在PDFStore找到:

http://www.pdfstore.com/category.asp?CtgID=5

但這些軟體有二問題,一是$,都貴得驚人。二是這些軟體是Windows界面,不支援cross platform和batch mode。

移到Unix平台去一找,類似的軟體基本上有二種implementation methods。

第一種,是軟體本身有自己的PDF Raster Engine和PDF Output Device。所謂的分割/合併PDF檔,只不過是把輸入的PDF以PDF Raster Engine轉成特定格式,原理和把PDF轉成PCL或Postscript後再送到Printer一樣,只不過現在是PDF經PDF Raster Engine,再轉回PDF而已。這類軟體以Ghostscript最為人熟知。Ghostscript可在此下:

http://www.cs.wisc.edu/~ghost/

合併PDF是這樣做的:

gs -sDEVICE=pdfwrite -dNOPAUSE -dQUIET -dBATCH -sOutputFile=out.pdf *.pdf

分割也大同小異,語法看看Manaul吧。

這種做法最大優點是:一,不用錢,二,因這做法是把原文件經PDF Raster Engine輸入,整合後再經PDF Writer輸出,所以理論上,只要軟體Raster Engine支援的文件格式,都可把其分割/合併。事實上,Ghostscript本身就支援PDF/Postscript,把數個Postscript和PDF混合成一檔也可以。

但這方法最大的問題是,因所有的工作基本上要經Raster Engine,所以PDF文件中用到的Font要全裝上Ghostscript, 再者,合成的PDF比原檔總和大不少。

除了Ghostscript, TexExec (Latex類的) 也是類似原理。

第二類軟體,是純在原文件作Syntactical Changes。如要合併二個PDF,這二個PDF有各自的Object List, Cross-Reference Table等,所謂合併,是把Object List, Cross-Reference Table等二合為一,這要對如Object ID之類的東西重新編號,這種軟體通常不大,執行快。而且因純是把原文件Parse和Generate Output File, 合成的PDF和原檔總和相約。

這裡介紹二個這類軟體,一個是Perl Module, 另一個是Java Jar.

a. PDF Extract (Perl Module).
用於分割PDF。可在這下Readme & Programme:

http://cpan.pair.com/modules/by-cate...ct-2.05.readme

http://cpan.pair.com/modules/by-cate...ct-2.05.tar.gz

安裝PDF Extract這個module後,只要三行碼便可把PDF中數頁抽出,如1至3,5和8頁。

use PDF::Extract;
$pdf = new PDF::Extract( PDFDoc =>"input.pdf", PDFPages =>"1-3 5 8" ) ;
$pdf->servePDFExtract;

簡單了吧。可惜是PDF Extract的作者未完成PDF::Merge。

b. PJ Classics / PJ Professional
很強的Java Library (Jar), 支援不少PDF有關功能。分割/合併只是其一。PJ Classics是不用錢的,但較慢和需較大記憶體。PJ Professional 是要錢的版本。URL是:

http://www.etymon.com/pdf_products.html

以下是以PJ Classics結合input1.pdf和input2.pdf的Java碼。用Java Jar有不少便利,特別是如果你要開取JSP/Servlet, 或XSLT等。

import com.etymon.pj.*;
public class Test {
public static void main (String args[]) {
try {
Pdf pdf = new Pdf("input1.pdf");
pdf.appendPdfDocument(new Pdf("input2.pdf"));
pdf.writeToFile("output.pdf");
}
catch (java.io.IOException ex) {System.out.println(ex);}
catch (com.etymon.pj.exception.PjException ex) {System.out.println(ex);}
}
}

說了一大篇,希望有用,有空再寫寫有關PDF結構的東西。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次