Considérez une requête SQL dont le résultat sera écrit dans le fichier pdf.Problème PDFBox lors de la création dynamique d'une nouvelle page
Je peux écrire le contenu (récupéré de la requête) dans le pdf avec succès mais il tronque le contenu s'il franchit la limite maximum d'une page. Cela signifie qu'une seule page est créée. En écrivant dans le pdf (via PDFBox), comment savoir que nous avons atteint la fin d'une page, afin que nous puissions déclencher doc.addPage(page);
une fois que nous savons dynamiquement que nous avons atteint le point final de la page.
Voici le code ci-dessous:
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;
}
Je ne comprends pas pourquoi c'est une question; vous êtes capable d'écrire des contenus. Ainsi, vous les mettez à des positions en Y. Parce que le haut d'une page est la hauteur, cela signifie que plus vous approchez du bas, plus votre valeur y est petite; et si c'est <0 alors vous ne le voyez plus. La seule explication que je peux trouver est que vous avez commencé avec y = 0 et n'avez pas remarqué que sur votre page tout était en sens inverse. –
Mis à jour le message avec mon code existant. –
Vous devrez introduire une variable dans laquelle vous noterez la coordonnée ** y ** actuelle, en la définissant à 'startY' quand vous faites' contentStream.newLineAtOffset (startX, startY) ', en la diminuant par' leading' chaque fois que vous faire 'contentStream.newLineAtOffset (0, -leading)', et vérifier dans ces situations, aussi, si cette valeur de la variable est trop petite (plus comme moins de 'marge'). – mkl