史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   應用軟體使用技術文件 (http://forum.slime.com.tw/f130.html)
-   -   分割/合併PDF檔 (http://forum.slime.com.tw/thread82718.html)

psac 2003-11-17 12:33 PM

分割/合併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結構的東西。

hb122789777 2003-12-11 08:52 PM

謝謝大大


所有時間均為台北時間。現在的時間是 11:34 AM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1