删除多余的空白行

时间:2016-09-07 21:05:35

标签: java pdf itext

我在java中使用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
        }

    }

PS:上面是我的java代码,我只想删除#ACC004342-123和更多信息之间存在的更多空行:行,只需在它们之间留一个空行。当我从webservice调用获取内容时,我需要处理我的java代码。希望我现在明白了。感谢。

3 个答案:

答案 0 :(得分: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的每一行之前添加额外的空格,除非该行是页面的第一行。在这种情况下,不会添加不需要的空白区域。

如果这不能回答您的问题,请重新提问。它已经比你之前的问题更加清晰了,但第三方仍然需要做很多猜测工作才能完全理解你的要求。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

我已阅读你对我之前回答的评论:

  

我只想删除#ACC004342-123和更多信息之间的额外空白:语句并在PDF中打印。在我的代码中,我使用了document.add(new Paragraph(“”));只给一个空行一次..因为内容是动态的,因为我说我们在ACC和更多信息之间获得了额外的空白行:我们需要在我们这边处理的行,删除那些额外的行(在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”的行,就会跳过所有空行,直到遇到非空的行。现在您不必删除任何空行,它们都被跳过。

<强>更新

如果您想证明您的问题不是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.