[英]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.