考慮一個SQL查詢,其結果將寫入pdf中。動態創建新頁面時出現PDFBox問題
我可以成功地在pdf中寫入內容(從查詢中檢索),但如果內容超過一頁的最大限制,它會截斷內容。這意味着,只有一個頁面被創建。
在寫入pdf(通過PDFBox)時,如何知道我們已經到達頁面的末尾,以便在動態地知道我們已經到達頁面的終點時觸發doc.addPage(page);
。
這裏是下面的代碼:
public PDDocument processPdf(Class1 objectClass1) {
String text;
int count;
//New Document is created
PDDocument doc = new PDDocument();
List<Class1Questions> objectClass1Questions;
Class2 objectClass2;
try {
float fontSize = 12;
float margin = 72;
float leading = 1.5f * fontSize;
PDFont font = PDType1Font.HELVETICA;
PDPage page = new PDPage();
page.setMediaBox(PDRectangle.A4);
PDRectangle pageSize = page.getMediaBox();
float startX = pageSize.getLowerLeftX() + margin;
float startY = pageSize.getUpperRightY() - margin;
//First page is added
doc.addPage(page);
List<String> lines;
PDPageContentStream contentStream = new PDPageContentStream(doc, page);
contentStream.setFont(font, fontSize);
contentStream.beginText();
//The resultset gets collected and written in PDF.
text = objectClass1.getClass1Name();
lines = spacing(text, margin, font, pageSize);
contentStream.newLineAtOffset(startX, startY);
contentStream.showText("Class1: ");
for (String line : lines) {
contentStream.showText(line);
contentStream.newLineAtOffset(0, -leading);
}
List<Class1Version> versionList = objectClass1.getClass1Versions();
for (Class1Version version : versionList) {
String versionNum = Long.toString(version.getClass1VersionNumber());
contentStream.showText("Version: " + versionNum);
contentStream.newLineAtOffset(0, -leading);
objectClass1Questions = version.getClass1Questions();
count = 0;
for (Class1Questions objectClass1Question : objectClass1Questions) {
count++;
objectClass2 = objectClass1Question.getQuestion();
String question = objectClass2.getQuestionDesc();
lines = spacing(question, margin, font, pageSize);
contentStream.showText("Q" + count + ": ");
for (String line : lines) {
contentStream.showText(line);
contentStream.newLineAtOffset(0, -leading);
}
contentStream.newLineAtOffset(0, -leading);
}
}
contentStream.endText();
contentStream.close();
} catch (IOException e) {
e.printStackTrace();
}
return doc;
}
public List<String> spacing (String text, float margin, PDFont font, PDRectangle pageSize) throws IOException {
int lastSpace = -1;
List<String> lines = new ArrayList<String>();
float fontSize = 25;
float width = pageSize.getWidth() - 2*margin;
while (text.length() > 0)
{
int spaceIndex = text.indexOf(' ', lastSpace + 1);
if (spaceIndex < 0)
spaceIndex = text.length();
String subString = text.substring(0, spaceIndex);
float size = fontSize * font.getStringWidth(subString)/1000;
System.out.printf("'%s' - %f of %f\n", subString, size, width);
if (size > width)
{
if (lastSpace < 0)
lastSpace = spaceIndex;
subString = text.substring(0, lastSpace);
lines.add(subString);
text = text.substring(lastSpace).trim();
System.out.printf("'%s' is line\n", subString);
lastSpace = -1;
}
else if (spaceIndex == text.length())
{
lines.add(text);
System.out.printf("'%s' is line\n", text);
text = "";
}
else
{
lastSpace = spaceIndex;
}
}
return lines;
}
我不明白爲什麼這是一個問題;你可以寫內容。因此你把它們放在Y位置。因爲頁面的頂部是高度,這意味着越接近底部,y值越小;如果它<0,那麼你不再看到它。我能想出的唯一解釋是,你從y = 0開始,並沒有注意到你的頁面上的所有內容都是相反的。 –
用我現有的代碼更新了帖子。 –
您必須引入一個變量,在該變量中您記錄當前的** y **座標,並在您執行contentStream.newLineAtOffset(startX,startY)時將其設置爲'startY',並在每次您用'leading'做'contentStream.newLineAtOffset(0,-leading)',然後檢查這些情況,也就是說,這個變量值是否太小(大部分小於'margin')。 – mkl