2016-09-07 4 views
0

자바에서 itext API를 사용하여 PDF 문서의 동적 내용을 작성하고 인쇄하고 있습니다.여분의 빈 줄을 제거하십시오

다음은 PDF 문서에 추가해야하는 동적 콘텐츠입니다. 상기 나타낸 샘플 텍스트

This is first line. 
This is second line. 

This is third printed line. 

This is fourth printed line. 

#ACC004342-123 





More information: 
This is fifth printed line. 
#ACC004342-123 

This is Sixth printed line. 
Some information goes here. 

는 # ACC004342-123과 추가 정보 사이의 갭들이있다 : 나 제거해야 라인.

public static File createInformationPdf(final List<MyDocumentType> content) throws AccServiceException 
    { 
     Document document = null; 
     FileOutputStream fos = null; 

     try 
     { 
      final String prefix = "letter"; 
     final File myPDF = File.createTempFile(prefix, ".pdf"); 
     document = new Document(PageSize.LETTER); 

     fos = new FileOutputStream(temporaryPDF); 

     PdfWriter.getInstance(document, fos); 
     document.open(); 

     Font font = new Font(Font.FontFamily.COURIER,10); 
    for (final MyDocumentType myDocument : content) 
     { 
      if (myDocument.getDocumentines() != null) 
      { 
       final DocumentLinesType documentLines = myDocument.getDocumentLines(); 
       for (final String line : documentLines.getDocumentLine()) 
       { 
      document.add(new Paragraph(line,font)); 
       } 
      } 
    } 
      document.close(); 
      return temporaryPDF; 
     } 
     catch (Exception e) 
     { 
     //log the exception 
     } 

    } 

추신 : 라인과 단지 그들 사이에 하나 개의 빈 줄을 제공 : 위는 난 그냥 빈 # ACC004342-123 및 상세 정보 사이에 존재하는 라인의 많은 수를 제거 하려는, 내 자바 코드입니다. 웹 서비스 호출에서 그 내용을 얻는 동안 내 Java 코드를 처리해야합니다. 희망은 지금 분명하다. 감사.

+0

이것은 이전 질문보다 더 나은 설명입니다. 수여 : 당신은 이제 더러운 코더라고 인정하지만 적어도 지금 당신을 도울 수 있고 당신이 잘못한 것을 설명 할 수 있습니다. 우리는 이제 불필요한 공백을 일으키는 원인을 이해합니다. –

답변

0

플래그가 논리를 과소 평가하여 그 사용이 명확하지 않습니다. 나는 아래 코드가 당신이 원하는 것을해야한다고 생각한다.

if 문은 '#ACC'행인지 확인합니다. 이 경우 문서를 다른 빈 줄을 건너 뛰고 비어 있지 않은 첫 번째 줄을 반환하는 다른 방법으로 전달합니다. 이것은 귀하의 경우에 '추가 정보'라인입니다.

'#ACC'행을 찾지 못하면 정상적으로 행이 인쇄됩니다.

public void removeMultipleEmptyLines(Document document){ 
    for (final String singleLine : document.getSingleLine()) { 
     if (singleLine.contains("#ACC")) { 
      document.add(new Paragraph(" ")); //adding one blank line 
      String nextNonEmptyLine = getNextNonEmptyLine(Document document);//this should return the information line 
      document.add(new Paragraph(12, nextNonEmptyLine, font)); 
     }else{ 
      document.add(new Paragraph(12, singleLine, font));    
     } 
    } 
} 

private String getNextNonEmptyLine(Document document) { 
    String singleLine = document.getSingleLine(); 
    while(singleLine.trim().length() == 0){ 
     singleLine = document.getSingleLine(); 
    } 
    return singleLine; 
} 
+0

getSingleLine() 메서드는 Document 형식이 아닙니다. 내부 메서드는 Document 객체에 속합니다[email protected] – javaUser

+0

문서는 당신이 지정하지 않았고 처음 질문을 게시했을 때 어떻게 사용했는지 자신의 내부 클래스라고 가정했습니다. – ColonelCustard

+0

예, 죄송합니다. 이제 내 게시물에서 코드를 정리했습니다. if (singleLine.contains ("# ACC")) 또는 다른 정적 문자열과 같은 정적 컨텐츠와 비교하지 않고 위에 제안한 것처럼 2 개 이상의 빈 줄이 있는지 확인하여 방금 추가 빈 줄을 제거 할 수 있습니까? 동적 컨텐트에 이러한 문자열이없는 시나리오가 있음을 알 수 있습니다. 각 인쇄 된 줄 사이에 빈 줄 2 개를 허용 할 수 있지만 그 이하는 허용되지 않습니다. 왜냐하면 내 동적 인 내용에서 때로는 단락 사이에 공백 행 하나와 공백 행 2 개가 허용되어야하기 때문입니다. @ ColonelCustard – javaUser

1

당신이 몇 가지 여분의 공간에게 #ACC가 추가 포함하는 행을마다하고 싶지 것으로 보인다. 그러나 이전 질문 인 limited content을 기반으로 #ACC이 포함 된 줄이 페이지의 마지막 줄인 경우 추가 공백이 추가되지 않도록하려는 것입니다.

공백 행을 추가하려면 Paragraph을 추가하십시오. 그것은 좋은 생각이 아닙니다. 빈 칸은 이 항상 인 것을 의미합니다. 원하지 않는 경우에도 마찬가지입니다.

setSpacingAfter() 방법을 사용하는 것이 훨씬 좋습니다. 예를 들어 :

float spaceBetweenLines = 12; 
Paragraph p; 
for (final String singleLine : document.getSingleLine()) { 
    p = new Paragraph(spaceBetweenLines, singleLine, font); 
    if (singleLine.contains("#ACC")) { 
     p.setSpacingAfter(spaceBetweenLines); 
    } 
    if (!singleLine().isEmpty()) 
     document.add(p); 
} 

이 코드는 읽고 당신이 당신의 코드를 읽는 사람이 이해하기 매우 어려운 이유 플래그를 설정 어디에 코드를보다 이해하기 훨씬 쉬워 (또는 누가 코드를 유지한다).

사실 : 빈 줄을 추가하는 동시에 빈 줄을 제거하기 때문에 질문을 이해하기가 여전히 어렵습니다. 제 3자가 빈 줄을 추가하는 이유를 이해하는 것은 매우 어렵습니다.

setSpacingAfter()과 같은 메서드를 사용할 때의 장점은 필요한 경우 추가 공간 만 추가한다는 것입니다. Paragraph이 문서의 마지막 단락이면 공백이 추가되지 않습니다. 새 페이지보다 마지막 단락 인 경우 공백이 추가되지 않으며 이전 질문에서 설명한 문제 인 다음 페이지에 불필요한 여유 공간이 없습니다 (limited content).

아니면이 질문을 잘못 해석하고 있습니다. 어쩌면 앞에 여분의 공백을 추가하고 단락을 추가하려고합니다.이 경우, 당신은 setSpacingBefore() 방법을 사용할 수 있습니다 : 그 라인은 페이지의 첫 번째 라인이 아닌 경우이 경우

float spaceBetweenLines = 12; 
Paragraph p; 
for (final String singleLine : document.getSingleLine()) { 
    p = new Paragraph(spaceBetweenLines, singleLine, font); 
    if (singleLine.contains("#ACC")) { 
     p.setSpacingBefore(spaceBetweenLines); 
    } 
    if (!singleLine().isEmpty()) 
     document.add(p); 
} 

을, 여분의 공간은, 전에 #ACC을 포함하는 모든 라인을 추가됩니다. 이 경우 불필요한 공백이 추가되지 않습니다.

그래도 질문에 답할 수없는 경우 질문을 수정하십시오. 그것은 이전의 질문보다 더 분명합니다. 그러나 제 3자가 여전히 당신이 요구하는 것을 완전히 이해하기 위해 많은 추측을해야합니다.

+0

# ACC004342-123과 추가 정보 : 문 사이의 여분의 공백 행을 제거하고 PDF로 인쇄하고 싶습니다. 그리고 내 코드에서 나는 document.add (새로운 단락 ("")); 한 번만 한 빈 줄을 제공합니다. 내용이 동적 인 것처럼 나는 ACC와 여분의 정보 사이에 여분의 빈 줄이 생깁니다. 우리 쪽에서 처리해야하는 줄, 여분의 줄을 제거하십시오 (ACC와 자세한 정보 : 문) 및 PDF로 인쇄하지만 내가 다른 줄 사이에있는 모든 빈 줄을 제거하고 싶지 않아. @BrunoLowagie – javaUser

+0

잘 이해한다면 "# ACC004342-123"과 "추가 정보 :"가 같은 줄에 표시되기를 원하십니까? 이것이 올바른 해석이 아닌 경우 : 어떤 선을 제거해야합니까? 그 라인은 어디에서 왔습니까? 당신이 그들을 원하지 않는다면, 왜 당신이 그들을 처음에 추가하고 있습니까? 당신은 여전히 ​​불분명합니다. –

+0

내 질문에 표시된 내 동적 콘텐츠 텍스트를 참조하십시오. 나는 웹 서비스 호출에서 그 내용을 얻고있다. 그리고 "# ACC004342-123"및 "추가 정보 :"를 발견하면 빈 줄 수가 더 많습니다. 그 빈 줄을 제거하고 그 두 문장 사이에 빈 줄을 하나 만들고 나머지 내용은 그대로 인쇄해야합니다. "# ACC004342-123"과 "추가 정보 :"사이에 여분의 여백을 지우고 싶습니다. 나는 그 (것)들이 동일한 선에 있고 싶지 않다, 다만 공백 선의 그 더 많은 수를 제거하십시오. @ 브루노 로우 아기. – javaUser

0

내 이전의 대답에 귀하의 코멘트를 읽고 : PDF의 문 및 인쇄 :

난 그냥 여분의 빈 # ACC004342-123 및 상세 정보 사이의 라인을 제거 할. 그리고 내 코드에서 나는 document.add (새로운 단락 ("")); 한 번만 한 빈 줄을 제공합니다. 내용이 동적 인 것처럼 나는 ACC와 여분의 정보 사이에 여분의 빈 줄이 생깁니다. 우리 쪽에서 처리해야하는 줄, 여분의 줄을 제거하십시오 (ACC와 자세한 정보 : 문) 및 PDF로 인쇄하지만 내가 다른 줄 사이에있는 모든 빈 줄을 제거하고 싶지 않아.

아마도 귀하의 질문에 대한 답변은 매우 간단합니다. 어쩌면 당신은 질문을 너무 복잡하게 만들고 있습니다.

당신은이 방법에 대해 어떻게 생각하십니까 : 나는 getSingleLine() 방법은 목록의 어떤 종류를 반환하는 가정입니다

final DocumentLinesType documentLines = myDocument.getDocumentLines(); 
List<String> lines = documentLines.getDocumentLine(); 
String line; 
for (int i = 0; i < lines.size();) { 
    line = lines.get(i); 
    document.add(new Paragraph(12, lines.get(i), font)); 
    i++; 
    if (line.contains("#ACC")) { 
     while (lines.get(i).isEmpty()) 
      i++; 
    } 
} 

. 모르겠지만, 당신이 for (final String singleLine : myDocument.getSingleLine())을 사용하고 있기 때문에, 그것은 공정한 가정입니다.

"#ACC"가 포함 된 줄이 발견되면 비어 있지 않은 줄이 나올 때까지 모든 빈 줄을 건너 뜁니다. 이제 빈 줄을 제거 할 필요가 없습니다. 모두 건너 뜁니다.

업데이트 :

public static void main(String[] args) { 
    List<String> lines = new ArrayList<String>(); 
    lines.add("This is first line."); 
    lines.add("This is second line."); 
    lines.add(""); 
    lines.add("This is third printed line."); 
    lines.add(""); 
    lines.add("This is fourth printed line."); 
    lines.add(""); 
    lines.add("#ACC004342-123"); 
    lines.add(""); 
    lines.add(""); 
    lines.add(""); 
    lines.add(""); 
    lines.add(""); 
    lines.add("More information:"); 
    lines.add("This is fifth printed line."); 
    lines.add("#ACC004342-123"); 
    lines.add(""); 
    lines.add("This is Sixth printed line."); 
    lines.add("Some information goes here."); 

    String line; 
    for (int i = 0; i < lines.size();) { 
     line = lines.get(i++); 
     System.out.println(line); 
     if (line.contains("#ACC")) { 
      while (lines.get(i).isEmpty()) i++; 
     } 
    } 
} 

이 코드의 출력은 다음과 같습니다 :

This is first line. 
This is second line. 

This is third printed line. 

This is fourth printed line. 

#ACC004342-123 
More information: 
This is fifth printed line. 
#ACC004342-123 
This is Sixth printed line. 
Some information goes here. 
당신이 당신의 질문은이 iText 질문 아님을 증명하려는 경우

이 예제를보십시오

"# ACC#"이 포함 된 행 다음에 더 이상 공백 행이 없지만 다른 모든 공백 행은 보존됩니다.

더 "추가 정보 라인 :"이없는 경우 "#ACC"와 줄 끝에서 모든 빈 줄을 유지하려면, 당신은 작은 조정을 할 필요가 : 지금

public static void main(String[] args) { 
    List<String> lines = new ArrayList<String>(); 
    lines.add("This is first line."); 
    lines.add("This is second line."); 
    lines.add(""); 
    lines.add("This is third printed line."); 
    lines.add(""); 
    lines.add("This is fourth printed line."); 
    lines.add(""); 
    lines.add("#ACC004342-123"); 
    lines.add(""); 
    lines.add(""); 
    lines.add(""); 
    lines.add(""); 
    lines.add(""); 
    lines.add("More information:"); 
    lines.add("This is fifth printed line."); 
    lines.add("#ACC004342-123"); 
    lines.add(""); 
    lines.add("This is Sixth printed line."); 
    lines.add("Some information goes here."); 

    String line; 
    for (int i = 0; i < lines.size();) { 
     line = lines.get(i++); 
     System.out.println(line); 
     int j = i; 
     if (line.contains("#ACC")) { 
      while (lines.get(j).isEmpty()) j++; 
      if (lines.get(j).contains("More information")) 
       i = j; 
     } 
    } 
} 

가 출력은 다음과 같습니다.

This is first line. 
This is second line. 

This is third printed line. 

This is fourth printed line. 

#ACC004342-123 
More information: 
This is fifth printed line. 
#ACC004342-123 

This is Sixth printed line. 
Some information goes here. 
+0

제 원래 코드 editied 및 위의 내 질문에 추가하십시오. 내 코드에서 배치 할 수있는 방법을 혼란 스러워요. 내 루프를 각각 제거하고 코드로 시도하십시오. 죄송합니다. 너무 많은 질문 .. @ 브루노 Lowagie – javaUser

+0

정말 짜증나는 것은 당신이 잘못된 질문을하고 있다는 것입니다. '내용'이란 무엇입니까? 'DocumentType'의'List'입니까? 'DocumentType'은 무엇이고'DocumentLinesType'입니까? 'getDocumentLine()'은 무엇을 돌려 주나요? 'List '입니까? Stack Overflow 사용자로부터 분노한 반응을 일으키는 트롤처럼 들립니다. 왜 당신은 스스로를 javaUser라고 부릅니까? –

+0

Iam 문제가 생겨서 죄송합니다. 정확하게 원했던 것을 표현할 수 없을 수도 있습니다. webservice에서 콘텐츠를 가져 오는 중이고 질문을 더 쉽게 만들어야한다고 생각했습니다. 모든 반환 유형을 추가하지 않은 이유입니다. 간단하게 내 편집 된 자바 코드를보고 컨텐츠를보고 싶습니다. #ACC와 그 이상의 정보 사이에 빈 줄이 더 많이 필요합니다. 줄을 ... 감사합니다. @Bruno Lowagie – javaUser

관련 문제