2011-08-29 1 views
3

제 PDF 변환기 프로그램에 대한 약간의 도움이 필요합니다.Java : PDF 변환기는 Mac에서 작동하지만 Windows에서는 빈 PDF 파일을 생성합니다.

그래서 저는 JADE 프레임 워크를 사용하여이 모바일 에이전트 PDF 변환기를 만들고 있습니다. 그러나 필자가 직면하고있는 문제는 텍스트 파일을 PDF로 변환하고 네트워크를 통해 이진 파일로 보내고 PDF 파일을 다시 복원하는 방식과 관련이 있습니다.

필자가 작성한 프로그램은 MacBook에서 제대로 작동합니다. 그러나 Windows에서는 내 PDF 파일을 빈 PDF로 복원합니다.

다음은 PDF 파일을 보내는 데 사용하는 코드입니다.

private void sendPDF(File f, String recipient) { 
    String content = ""; 

    if(f != null) { 
     try { 
      FileInputStream fis = new FileInputStream(f); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

      int noBytesRead = 0; 
      byte[] buffer = new byte[1024]; 

      while((noBytesRead = fis.read(buffer)) != -1) { 
       baos.write(buffer, 0, noBytesRead); 
      } 

      content = baos.toString(); 
      fis.close(); 
      baos.close(); 

      System.out.println("Successful PDF-to-byte conversion."); 
     } catch (Exception e) { 
      System.out.println("Exception while converting PDF-to-byte."); 
      content = "failed"; 
      e.printStackTrace(); 
     } 
    } else { 
     System.out.println("PDF-to-file conversion failed."); 
     content = "failed"; 
    } 

    ACLMessage message = new ACLMessage(ACLMessage.INFORM); 
    message.addReceiver(new AID(recipient, AID.ISLOCALNAME)); 
    message.setContent(content); 

    myAgent.send(message); 
    System.out.println("PDF document has been sent to requesting client."); 
} 

그리고 여기에 PDF를 복원하는 데 사용하는 코드가 있습니다.

private File restorePDF(String content) { 
    String dirPDF = dirBuffer + "/" + new Date().getTime() + ".pdf"; 
    File f = new File(dirPDF); 

    try { 
     if(!f.exists()) f.createNewFile(); 

     byte[] buffer = new byte[1024]; 
     ByteArrayInputStream bais = new ByteArrayInputStream(content.getBytes()); 
      FileOutputStream fos = new FileOutputStream(f); 

     int noBytesRead = 0; 
     while((noBytesRead = bais.read(buffer)) != -1) { 
       fos.write(buffer, 0, noBytesRead); 
    } 

     fos.flush(); 
     fos.close(); 
     bais.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     f = null; 
    } 

    return f; 
} 

이 문제에 대한 도움을 주시면 감사하겠습니다. :)

+0

모든 로그? 예외? 추적? – Snicolas

답변

0

하나의 문제는 잘못된 구분 문자를 사용하고 있다는 것입니다. Java에는 올바른 함수에 올바른 char를 반환하는 내장 함수가 있습니다. separator char을 참조하십시오.

코드는 참고로이

String dirPDF = dirBuffer + File.separatorChar + new Date().getTime() + ".pdf"; 

처럼 보일 것입니다 :

separatorChar입니다

시스템에 의존하는 디폴트의 이름 단락 문자입니다. 이 필드는 시스템 속성 file.separator 값의 첫 번째 문자를 포함하도록 초기화 된 입니다. UNIX 시스템에서이 필드의 값은 '/'입니다. Microsoft Windows 시스템에서는 '\'입니다.

1

질문은 PDF 콘텐츠와 관련이 없기 때문에 약간 혼란 스럽습니다.

실제로 바이트를 보내고 실제로 문자열을 보내고 문자열 인코딩이 클라이언트와 서버에서 다르다고 가정합니다.

content = baos.toString(); 

과 :

은 문제가 발생할 경우 일반적으로

content.getBytes() 
+0

그게 다라고 생각합니다. PDF로 읽은 다음 문자열로 변환한다는 것은 인코딩이 양쪽에서 일치하더라도 매우 위험한 것으로 보입니다. @ hsoetikno : 그냥 바이트를 쓸 수 없습니까? 그렇지 않다면 BASE64 같은 것을 사용하십시오. – Thilo

1

PDF 파일은 문자열 것 그것을 만들기 위해 룩업 테이블 및 이진 데이터 블록의 많은 바이너리 파일 형식입니다 부숴. PDF 파일의 내부에 대해 알고 싶다면 블로그 게시물 전체를 작성했습니다 (http://www.jpedal.org/PDFblog/2010/09/understanding-the-pdf-file-format). -series /)