英文:
Apache PDFBox PDPageContentStream showText and drawImage sometimes don't work or show upside down
问题
private byte[] setPageNumbers(byte[] pdftmp, Integer initialPage, Integer finalPage) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PDDocument document = PDDocument.load(pdftmp);
PDPage page;
String numberingFormat = " {0}";
int offset_X = 45;
int offset_Y = 803;
int page_counter = 1;
Color color = new Color(0);
float[] components = new float[] {color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f };
float x;
float y;
PDPageContentStream contentStream;
PDRectangle pageSize;
String text;
PDImageXObject pdImage;
for(int i = initialPage; i <= finalPage; i++) {
page = document.getPage(i);
pageSize = page.getMediaBox();
x = pageSize.getLowerLeftX();
y = pageSize.getLowerLeftY();
text = MessageFormat.format(numberingFormat,page_counter);
contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 11);
contentStream.setNonStrokingColor(new PDColor(components, PDDeviceRGB.INSTANCE));
contentStream.beginText();
contentStream.newLineAtOffset(x + pageSize.getWidth() - offset_X, y+offset_Y);
contentStream.showText(text);
contentStream.endText();
++page_counter;
pdImage = PDImageXObject.createFromFile(PDChoice.class.getResource("/images/logo.png").getPath(),document);
contentStream.drawImage(pdImage, x + pageSize.getWidth() - offset_X - 7, y + offset_Y - 2);
contentStream.close();
}
document.save(baos);
document.close();
return baos.toByteArray();
}
英文:
Regards,
I have a function that put page numbers and logos at right top.
The code works fine in almost every pages.
But, in some pages, the page number and its logo don't show.
In another pages, the page number and its logo show upside down at the left bottom.
Any idea about causes?
Code bellow, thanks.
private byte[] setPageNumbers(byte[] pdftmp, Integer initialPage, Integer finalPage) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PDDocument document = PDDocument.load(pdftmp);
PDPage page;
String numberingFormat = " {0}";
int offset_X = 45;
int offset_Y = 803;
int page_counter = 1;
Color color = new Color(0);
float[] components = new float[] {color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f };
float x;
float y;
PDPageContentStream contentStream;
PDRectangle pageSize;
String text;
PDImageXObject pdImage;
for(int i = initialPage; i <= finalPage; i++) {
page = document.getPage(i);
pageSize = page.getMediaBox();
x = pageSize.getLowerLeftX();
y = pageSize.getLowerLeftY();
text = MessageFormat.format(numberingFormat,page_counter);
contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 11);
contentStream.setNonStrokingColor(new PDColor(components, PDDeviceRGB.INSTANCE));
contentStream.beginText();
contentStream.newLineAtOffset(x + pageSize.getWidth() - offset_X, y+offset_Y);
contentStream.showText(text);
contentStream.endText();
++page_counter;
pdImage = PDImageXObject.createFromFile(PDChoice.class.getResource("/images/logo.png").getPath(),document);
contentStream.drawImage(pdImage, x + pageSize.getWidth() - offset_X - 7, y + offset_Y - 2);
contentStream.close();
}
document.save(baos);
document.close();
return baos.toByteArray();
}
答案1
得分: 2
我是这样解决的...
...
int degree;
float tx;
float ty;
width = Math.round(pageSize.getWidth()*25.4/72); // pts to mm
height = Math.round(pageSize.getHeight()*25.4/72); // pts to mm
degree = page.getRotation();
// 我想要A4纵向...
// 它是横向的... 转为纵向
if (degree == 90 || degree == 270 || width > height) {
page.setRotation(0);
}
// 它不是A4尺寸... 调整为
if (width != 210.0 || height != 297.0) {
page.setMediaBox(PDRectangle.A4);
}
...
// 有些页面是正确的,但需要旋转。我可能不想旋转这些页面,所以
// 我旋转内容
if (degree == 180) {
tx = (pageSize.getLowerLeftX() + pageSize.getUpperRightX()) / 2;
ty = (pageSize.getLowerLeftY() + pageSize.getUpperRightY()) / 2;
contentStream.transform(Matrix.getTranslateInstance(tx, ty));
contentStream.transform(Matrix.getRotateInstance(Math.toRadians(180), 0, 0));
contentStream.transform(Matrix.getTranslateInstance(-tx, -ty));
}
...
英文:
I solved this way...
...
int degree;
float tx;
float ty;
width = Math.round(pageSize.getWidth()*25.4/72); // pts to mm
height = Math.round(pageSize.getHeight()*25.4/72); // pts to mm
degree = page.getRotation();
// I want A4 portrait...
// It's landscape... change to portrait
if (degree == 90 || degree == 270 || width > height) {
page.setRotation(0);
}
// It is not A4... change to
if (width != 210.0 || height != 297.0) {
page.setMediaBox(PDRectangle.A4);
}
...
// Some pages are right, but with rotation. I may not rotate this pages, so
// I rotate the content
if (degree == 180) {
tx = (pageSize.getLowerLeftX() + pageSize.getUpperRightX()) / 2;
ty = (pageSize.getLowerLeftY() + pageSize.getUpperRightY()) / 2;
contentStream.transform(Matrix.getTranslateInstance(tx, ty));
contentStream.transform(Matrix.getRotateInstance(Math.toRadians(180), 0, 0));
contentStream.transform(Matrix.getTranslateInstance(-tx, -ty));
}
...
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论