2017-02-01 6 views
1

Я использую itextpdf версии 5.0.1 для разбивки страниц на указанные номера страниц. У меня проблема, когда я пытаюсь вырезать PDF, который ориентирован в ландшафте. Когда я использую следующий код, ориентированные на ландшафт pdf-файлы становятся обрезанными, как 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» - эта версия очень старая и я не работал с ним в течение веков; Я написал код ниже текущей версии 5.x iText (ветка разработки 5.5.11). Он может работать без каких-либо или только минимальных изменений со старыми версиями.

Эффективно ваш метод 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); 
    } 
}