2017-02-01 127 views
1

我正在使用itextpdf版本5.0.1將頁面切割成指定的頁碼。當我嘗試剪切以橫向爲導向的PDF時遇到問題。當我使用下面的代碼時,面向橫向的pdf將會像potrait pdf一樣被截斷,其餘的則不見了。我使用的代碼是:iText PDF方向

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(); 
    } 
} 
} 
+0

對於你的任務,你真的應該使用'PdfCopy'基於實現(除其它優勢外並不需要你控制頁面旋轉),而不是你的'PdfWriter'的基礎一。 – mkl

+0

我無法得到你想說的話。你能否更詳細地解釋一下? –

回答

1

您參考「itextpdf 5.0.1版本」 - 該版本是非常老,我還沒有與它的工作的年齡;我在iText(5.5.11開發分支)的當前5.x版本中編寫了下面的代碼。它可能與舊版本沒有或只有很小的變化一起工作。

實際上,您的splitPdfFile方法會提取給定文檔的部分文檔。而不是您的方法(將頁面內容複製到新的PDF中),將現有文檔簡單地限制爲其自身的子集要容易得多。此方法還具有這樣的優點,即它不必分別處理不是來自頁面內容的屬性,例如,頁面旋轉。

的碼,該位,例如,

try ( InputStream resource = [...]; 
     OutputStream result = [...]) 
{ 
    PdfReader pdfReader = new PdfReader(resource); 
    pdfReader.selectPages("2-4"); 
    new PdfStamper(pdfReader, result).close(); 
} 

SubDocument.java測試方法testExtractSubDocument

寫入2,3 4從輸入文件到結果的文檔頁面,和。


附註:即使對於並非如此簡單的使用情況,例如,收集來自多個源PDF的頁面,使用您的方法是次優的;而不是PdfWriter應該使用Pdf*Copy*類的一個類,該類也正確地複製頁面旋轉。

0

下面的代碼解決我的問題

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); 
    } 
}