2013-06-03 2 views
12

Мне нужно прочитать pdf-файл с файловым «C: \ file.pdf» и записать его в outputStream. Какой самый простой способ сделать это?Как читать pdf-файл и записывать его в outputStream

@Controller 
public class ExportTlocrt { 

@Autowired 
private PhoneBookService phoneBookSer; 

private void setResponseHeaderTlocrtPDF(HttpServletResponse response) { 
    response.setContentType("application/pdf"); 
    response.setHeader("content-disposition", "attachment; filename=Tlocrt.pdf"); 
} 

@RequestMapping(value = "/exportTlocrt.html", method = RequestMethod.POST) 
public void exportTlocrt(Model model, HttpServletResponse response, HttpServletRequest request){ 

    setResponseHeaderTlocrtPDF(response); 
    File f = new File("C:\\Tlocrt.pdf"); 

    try { 
     OutputStream os = response.getOutputStream(); 
     byte[] buf = new byte[8192]; 
     InputStream is = new FileInputStream(f); 
     int c = 0; 
     while ((c = is.read(buf, 0, buf.length)) > 0) { 
      os.write(buf, 0, c); 
      os.flush(); 
     } 
     os.close(); 
     is.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
} 

........................................... ................................................

+0

Ваш вопрос, кажется, запрашивает процедуру копирования из файла в выделенный ответ «OutputStream» и «@Pheonix», показывает, как это сделать - есть ли какая-либо причина, по которой вы отметили свой вопрос [pdf], не говоря уже о [itext] ? – mkl

+0

Я использовал Itext в своем проекте для чего-то еще, поэтому я подумал, что он может быть использован в этом примере. Я был неправ. –

+0

Действительно, как и ответ @ Stephan представил решение с использованием PDFBox, вы также могли бы использовать iText для первого анализа всего PDF-файла, а затем сериализовать его снова. Но копирование PDF таким образом с помощью библиотеки PDF (будь то PDFBox или iText) - большая трата ресурсов и может изменить PDF-файл. – mkl

ответ

24
import java.io.*; 


public class FileRead { 


    public static void main(String[] args) throws IOException { 


     File f=new File("C:\\Documents and Settings\\abc\\Desktop\\abc.pdf"); 

     OutputStream oos = new FileOutputStream("test.pdf"); 

     byte[] buf = new byte[8192]; 

     InputStream is = new FileInputStream(f); 

     int c = 0; 

     while ((c = is.read(buf, 0, buf.length)) > 0) { 
      oos.write(buf, 0, c); 
      oos.flush(); 
     } 

     oos.close(); 
     System.out.println("stop"); 
     is.close(); 

    } 

} 

самый простой способ до сих пор. Надеюсь это поможет.

+0

Thx для справки. Это именно то, что мне нужно. –

+1

Возможно, что-то не хватает в вашем коде, или я что-то пропустил? Файл, который у меня есть, имеет 0 байтов, и я не могу его открыть. Я отредактирую свой вопрос с кодом. –

+0

@ JurajVlahović: работает отлично. – ankurtr

10

Вы можете использовать PdfBox от Apache, который прост в использовании и имеет хорошую производительность.

Ниже приведен пример извлечения текста из файла PDF (вы можете прочитать больше here):

import java.io.*; 
import org.apache.pdfbox.pdmodel.*; 
import org.apache.pdfbox.util.*; 

public class PDFTest { 

public static void main(String[] args){ 
PDDocument pd; 
BufferedWriter wr; 
try { 
     File input = new File("C:\\Invoice.pdf"); // The PDF file from where you would like to extract 
     File output = new File("C:\\SampleText.txt"); // The text file where you are going to store the extracted data 
     pd = PDDocument.load(input); 
     System.out.println(pd.getNumberOfPages()); 
     System.out.println(pd.isEncrypted()); 
     pd.save("CopyOfInvoice.pdf"); // Creates a copy called "CopyOfInvoice.pdf" 
     PDFTextStripper stripper = new PDFTextStripper(); 
     wr = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(output))); 
     stripper.writeText(pd, wr); 
     if (pd != null) { 
      pd.close(); 
     } 
     // I use close() to flush the stream. 
     wr.close(); 
} catch (Exception e){ 
     e.printStackTrace(); 
     } 
    } 
} 

UPDATE:

Вы можете получить текст, используя PDFTextStripper:

PDFTextStripper reader = new PDFTextStripper(); 
String pageText = reader.getText(pd); // PDDocument object created 
+0

Pdf содержит изображения с небольшим текстом. Мне не нужно записывать его в txt или другой файл, просто нужно записать его в OutputStream. –

+0

Это был только пример, который вы можете легко изменить. – Stephan

+0

см. Мой обновленный ответ. – Stephan