2017-02-01 1 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

해결 하나. – 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

다음 코드는 작업 당신이 정말로 (페이지 회전을 제어 할 필요가 없습니다 다른 장점들하는)는`PdfCopy` 기반 구현을 사용한다 대신`PdfWriter`의 근거를 들어 내 문제

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