2016-09-07 5 views
0

Я использую API itext в java для создания и печати динамического содержимого в документе 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 
     } 

    } 

PS: Выше мой Java-код, я просто хочу, чтобы удалить большее количество пустых строк, которые присутствуют между # ACC004342-123 и дополнительная информация: линий и просто дать одну пустую строку между ними. Поскольку я получаю этот контент из вызова webservice, мне нужно обрабатывать в своем 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() не является формой метода. Документ ... наш внутренний метод, который не принадлежит объекту [email protected] – javaUser

+0

Я предполагал, что документ был вашим собственным внутренним классом, как вы не указали, и вот как вы его использовали, когда вы впервые разместили вопрос. – ColonelCustard

+0

Да, извините за это. Теперь я очистил свой код в своем посте. Как было предложено выше, без сравнения со статическим содержимым, например if (singleLine.contains («# ACC»)) или любой другой статической строкой, можем ли мы просто слепо проверить, есть ли у нас более двух пустых строк, просто удалите эти дополнительные пустые строки. Как только заметил, что есть сценарии без этих строк в динамическом контенте. Он может допускать две пустые строки между каждой печатной линией, но не более того. Потому что в моем динамическом контенте иногда есть одна пустая строка, а иногда две пустые строки между абзацами, которые должны быть разрешены. @ 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); 
} 

Этот код намного легче читать и понимать, чем ваш код, где вы установили флаг по причине, что очень трудно понять, для тех, кто читает ваш код (или кто должен поддерживать свой код).

На самом деле: по-прежнему очень сложно понять ваш вопрос, потому что вы добавляете пустую строку и в то же время просите удалить пустую строку. Третьей стороне очень сложно понять, почему вы добавляете пустую строку в первую очередь.

Красота использования метода, такого как 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, если эта строка не является первой линией на одной странице. В этом случае нежелательное пустое пространство не добавляется.

Если это не ответит на ваш вопрос, пожалуйста, перефразируйте свой вопрос. Это уже более ясно, чем ваш предыдущий вопрос, но третьей стороне все еще приходится делать много догадок, чтобы полностью понять, что вы просите.

+0

Я просто хочу удалить лишние пустые строки между # ACC004342-123 и дополнительной информацией: заявления и печать в формате PDF. И в моем коде я использовал document.add (новый абзац ("")); просто дать одну пустую строку только один раз. Поскольку контент динамический, поскольку я сказал, что мы получаем эти дополнительные пустые строки между ACC и дополнительной информацией: строки, которые нам нужно обрабатывать на нашей стороне, удалите эти дополнительные строки (в betwen ACC и больше информации: заявления) и распечатать в PDF, но я не хочу удалять все пустые строки, которые у меня есть между другими строками. @BrunoLowagie – javaUser

+0

Итак, если я вас хорошо понимаю, вы хотите, чтобы «# ACC004342-123» и «Дополнительная информация:» были в одной строке? Если это неверная интерпретация: какие строки нужно удалить? Откуда берутся эти линии? Если вы не хотите их, почему вы добавляете их в первую очередь? Вы все еще неясны. –

+0

См. Мой динамический текст содержания, указанный в моем вопросе. Я получаю этот контент от вызова webservice. И если вы заметили «# ACC004342-123» и «Дополнительная информация:» между ними есть еще несколько пустых строк. Я просто хочу удалить эти более пустые строки и просто дать одну пустую строку между этими двумя утверждениями, а оставшийся контент должен печатать как есть. ТОЛЬКО ХОТИТЕ УДАЛИТЬ ЭТИ ДОПОЛНИТЕЛЬНЫЕ ПУСТОЙ ЛИНИИ МЕЖДУ «# ACC004342-123» и «Дополнительная информация:». я не хочу, чтобы они были в одной строке, просто удалите эти больше пустых строк. @Bruno Lowagie. – javaUser

0

Я прочитал ваш комментарий к моему предыдущему ответу:

Я просто хочу, чтобы удалить лишние пустые строки между # ACC004342-123 и дополнительной информацией: заявления и печатью в формате PDF. И в моем коде я использовал document.add (новый абзац ("")); просто дать одну пустую строку только один раз. Поскольку контент динамический, поскольку я сказал, что мы получаем эти дополнительные пустые строки между ACC и дополнительной информацией: строки, которые нам нужно обрабатывать на нашей стороне, удалите эти дополнительные строки (в betwen ACC и больше информации: заявления) и распечатать в PDF, но я не хочу удалять все пустые строки, которые у меня есть между другими строками.

Возможно, ответ на ваш вопрос очень прост. Возможно, вы задаете слишком сложный вопрос.

Что вы думаете о таком подходе:

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

Я предполагаю, что метод getSingleLine() возвращает какой-то список. Я не знаю, но поскольку вы используете for (final String singleLine : myDocument.getSingleLine()), это справедливое предположение.

Как только встречается строка, содержащая «#ACC», вы пропускаете все пустые строки до тех пор, пока не встретится строка, которая не является пустой. Теперь вам не нужно удалять пустые строки, все они пропущены.

Update:

Попробуйте этот пример, если вы хотите доказательство того, что ваш вопрос не IText вопрос:

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. 

Теперь больше нет пустых строк после строки, содержащей «# 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

Пожалуйста, см. Мой оригинальный код, отредактированный и добавленный в мой вопрос выше .. Теперь я запутался, как я могу поместить ваш код в свой код. Вы хотите, чтобы я удалял внутреннее для каждого цикла и пытался с вашим кодом ... слишком много вопросов .. @Bruno Lowagie – javaUser

+0

Вещь, которая действительно раздражает, заключается в том, что вы задаете неправильные вопросы. Что такое 'content'? Является ли это 'List'' DocumentType'? Что такое 'DocumentType' и' DocumentLinesType'? Что возвращает 'getDocumentLine()'? Это «Список '? Вы звучите как тролль, который пытается вызвать сердитые реакции пользователей Stack Overflow. Почему вы назвали себя javaUser? –

+0

Я сожалею о проблеме..Может быть, я не могу выразить то, что я точно хотел .. Как я получаю контент от webservice, и я думал, что должен сделать вопрос проще, потому что причина не добавила весь возвращаемый тип. сделайте это простым, пожалуйста, см. мой отредактированный код Java и посмотрите содержимое, я просто хотел удалить большее количество пустых строк, присутствующих между #ACC и Дополнительная информация: lines..thanks. @Bruno Lowagie – javaUser

Смежные вопросы