[英]remove extra blank lines
我在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代码中进行处理。 希望我现在清楚。 谢谢。
似乎您希望每次添加包含#ACC
都获得一些额外的空间。 但是,根据您之前的问题, 有限的内容 ,我们还知道,如果包含#ACC
的行是页面的最后一行, #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()
类的方法的setSpacingAfter()
在于,仅在必要时才添加额外的空间。 如果该Paragraph
是文档的最后一个段落,则不添加任何空格。 如果它是一个新的页面前的最后一段,没有空间添加(和你没有下一个页面,这是你以前提到的问题上不必要的额外空间有限的内容 )。
也许我误解了这个问题。 也许您想在段落前添加一些额外的空间。 在这种情况下,可以使用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
每一行之前都会添加额外的空间,除非该行是页面上的第一行。 在这种情况下,不会添加不需要的空白。
如果这不能回答您的问题,请重新填写您的问题。 它已经比您先前的问题更清楚了,但是第三方仍然需要做很多猜测工作才能完全理解您的要求。
该标志使您的逻辑过于复杂,其用途尚不清楚。 我认为下面的代码应该做您想要的。
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;
}
我已经阅读了您对以前的回答的评论:
我只想删除#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.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.