Issue
I am using itextpdf version 5.0.1 to cut pages into specified page numbers.I am facing a problem when I try to cut a PDF which is oriented in landscape. When I use the following code the landscape oriented pdfs are getting cut like a potrait oriented pdf and the rest is missing. The code I am using is:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
public class PDFSplitExample {
static void splitPdfFile(InputStream inputPdf,
OutputStream outputStream, int startPage,
int endPage) throws Exception{
//Create document and pdfReader objects.
Document document = new Document();
PdfReader pdfReader = new PdfReader(inputPdf);
//Get total no. of pages in the pdf file.
int totalPages = pdfReader.getNumberOfPages();
//Check the startPage should not be greater than the endPage
//and endPage should not be greater than total no. of pages.
if(startPage > endPage || endPage > totalPages) {
System.out.println("Kindly pass the valid values " +
"for startPage and endPage.");
}else{
// Create writer for the outputStream
PdfWriter writer =
PdfWriter.getInstance(document, outputStream);
//Open document
document.open();
//Contain the pdf data.
PdfContentByte pdfContentByte =
writer.getDirectContent();
PdfImportedPage page;
while(startPage <= endPage) {
document.newPage();
page=writer.getImportedPage(pdfReader, startPage);
pdfContentByte.addTemplate(page, 0, 0);
startPage++;
}
//Close document and outputStream.
outputStream.flush();
document.close();
outputStream.close();
}
}
public static void main(String args[]){
try {
//Prepare output stream for
//new pdf file after split process.
OutputStream outputStream1 =
new FileOutputStream("SplitFile1.pdf");
OutputStream outputStream2 =
new FileOutputStream("SplitFile2.pdf");
//call method to split pdf file.
splitPdfFile(new FileInputStream("TestFile.pdf"),
outputStream1, 1, 10);
splitPdfFile(new FileInputStream("TestFile.pdf"),
outputStream2, 11, 20);
System.out.println("Pdf file splitted successfully.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Solution
The following code solved my problem
private static void manipulateWithCopy(PdfReader reader,String result)
throws IOException, DocumentException {
int n = reader.getNumberOfPages();
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileOutputStream(result));
document.open();
for (int i = 0; i < n;) {
copy.addPage(copy.getImportedPage(reader, ++i));
}
document.close();
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try{
String path= "path/of/the/file/in/the/smb/storage";
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, "username", "password");//storing authentication details
SmbFile sFile = new SmbFile(path, auth);
FileOutputStream fileOutputStream;
InputStream fileInputStream;
String destFilename = "path/to/the/file";
fileOutputStream = new FileOutputStream(destFilename);
fileInputStream = sFile.getInputStream();
byte[] buf;
int len;
buf = new byte[16 * 1024 * 1024];
while ((len = fileInputStream.read(buf)) > 0) {
fileOutputStream.write(buf, 0, len);
}
InputStream inputPdf = new FileInputStream(destFilename);
PdfReader reader= new PdfReader(inputPdf);
reader.selectPages(stpg+"-"+endpg);
manipulateWithCopy(reader,destFilename);
reader.close();
}
catch(Exception e){
System.out.println(e);
}
}
Answered By - Geeth Govind S
Answer Checked By - Terry (JavaFixing Volunteer)