iText で実行するPDFを結合するクラスを書いてみた。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collection;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.PdfReader;
/**
* PDF結合.
*/
public class PDFcat {
private OutputStream out;
/** コンストラクタ. 出力ストリームは結合実行でCLOSEする */
public PDFcat(OutputStream out){
this.out = out;
}
public void join(String...targets){
File files = new File[targets.length];
for(int i=0;i < files.length;i++) files[i] = new File(targets[i]);
join(files);
}
public void join(Collection<File> files){
join(files.toArray(new File{}));
}
public void join(File...targets){
if (targets.length < 1) return;
try{
FileInputStream input = new FileInputStream(targets[0]);
PdfReader pdfreader = new PdfReader(input);
pdfreader.consolidateNamedDestinations();
Document document = new Document(pdfreader.getPageSizeWithRotation(1));
PdfCopy writer = new PdfCopy(document, out);
document.open();
int readMax = pdfreader.getNumberOfPages();
for(int i=1;i <= readMax;i++){
writer.addPage(writer.getImportedPage(pdfreader, i));
}
writer.freeReader(pdfreader);
input.close();
for(int i=1;i < targets.length;i++){
FileInputStream in = new FileInputStream(targets[i]);
PdfReader reader = new PdfReader(in);
reader.consolidateNamedDestinations();
int pageCount = reader.getNumberOfPages();
for(int p=1;p <= pageCount;p++){
writer.addPage(writer.getImportedPage(reader, p));
}
writer.freeReader(reader);
in.close();
}
document.close();
}catch(IOException | DocumentException e){
// TODO
e.printStackTrace();
}finally{
try{ out.close(); }catch(IOException e){}
}
}
}
====================
itext-2.1.7.jar が必要で、Maven で取得するのが楽であろう。
dependencyManagement で取ってこなくてはならない。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
</dependencies>
</dependencyManagement>
これだけの操作だけでなくPDFをいろいろと弄繰り回すなら、以下もpom,xml に書いて取得します。
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<exclusions>
<exclusion>
<artifactId>bcmail-jdk14</artifactId>
<groupId>bouncycastle</groupId>
</exclusion>
<exclusion>
<artifactId>bcprov-jdk14</artifactId>
<groupId>bouncycastle</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcmail-jdk14</artifactId>
<version>1.46</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk14</artifactId>
<version>1.46</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bctsp-jdk14</artifactId>
<version>1.46</version>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>iTextAsian</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>5.6.0</version>
</dependency>