import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
public class PdfUtils {
private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class);
/**
* PDF파일에 비밀번호를 주입한다.
* @Param input : 원본 PDF파일 Path
* @Param output : 비밀번호 주입후 저장될 파일 Path
* @Param userPassword : output에 주입할 비밀번호
*/
public static void encryptPdf(String input, String output, String userPassword){
try {
//logger.info("Encrypt PDF:"+ input +" > "+ output);
PdfReader pdfReader = new PdfReader(input);
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(output));
pdfStamper.setEncryption(
userPassword.getBytes()
, "HelloJTNet".getBytes()
, PdfWriter.ALLOW_PRINTING
, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA
);
pdfStamper.close();
pdfReader.close();
} catch (IOException | DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* JPG 파일을 PDF로 변환한다.
* @param jpg : 원본 JPG 파일 Path
* @param pdf : 변환할 PDF파일 Path
*/
public static boolean convertJpg2Pdf(String jpg, String pdf) {
try {
//logger.info("Convert PDF:"+ jpg +" > "+ pdf);
Image img = Image.getInstance(jpg);
img.setRotationDegrees(0);
img.scaleAbsolute(PageSize.A4.getWidth(), PageSize.A4.getWidth()*img.getHeight()/img.getWidth());
Document document = new Document(PageSize.A4);
document.setMargins(0, 0, 0, 0);
FileOutputStream fos = new FileOutputStream(pdf);
PdfWriter pdfWriter = PdfWriter.getInstance(document, fos);
pdfWriter.open();
document.open();
document.add(img);
document.close();
pdfWriter.close();
return true;
} catch (IOException | DocumentException e) {
//e.printStackTrace();
return false;
}
}
/**
* PDF 파일 병합 변환한다.
* @param List<InputStream> : 병합할 PDF 파일 리스트
* @param OutputStream : 병합된 PDF 파일
*/
public static boolean mergePdfFiles(List<InputStream> inputPdfList, OutputStream outputStream){
//Create document and pdfReader objects.
Document document = new Document();
List<PdfReader> readers = new ArrayList<PdfReader>();
int totalPages = 0;
//Create pdf Iterator object using inputPdfList.
Iterator<InputStream> pdfIterator = inputPdfList.iterator();
try {
// Create reader list for the input pdf files.
while (pdfIterator.hasNext()) {
InputStream pdf = pdfIterator.next();
PdfReader pdfReader;
pdfReader = new PdfReader(pdf);
readers.add(pdfReader);
totalPages = totalPages + pdfReader.getNumberOfPages();
}
// Create writer for the outputStream
PdfWriter writer;
writer = PdfWriter.getInstance(document, outputStream);
//Open document.
document.open();
//Contain the pdf data.
PdfContentByte pageContentByte = writer.getDirectContent();
PdfImportedPage pdfImportedPage;
int currentPdfReaderPage = 1;
Iterator<PdfReader> iteratorPDFReader = readers.iterator();
// Iterate and process the reader list.
while (iteratorPDFReader.hasNext()) {
PdfReader pdfReader = iteratorPDFReader.next();
//Create page and add content.
while (currentPdfReaderPage <= pdfReader.getNumberOfPages()) {
document.newPage();
pdfImportedPage = writer.getImportedPage(pdfReader,currentPdfReaderPage);
pageContentByte.addTemplate(pdfImportedPage, 0, 0);
currentPdfReaderPage++;
}
currentPdfReaderPage = 1;
}
//Close document and outputStream.
outputStream.flush();
document.close();
outputStream.close();
System.out.println("Pdf files merged successfully.");
return true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Pdf files merged failed.");
return false;
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Pdf files merged failed.");
return false;
}
}
}