Java Apache PDFBox PDPageContentStream showText和drawImage有时不';不工作或显示颠倒
问候,, 我有一个功能,将页码和徽标放在右上方。 代码在几乎每一页都能正常工作。 但是,在某些页面中,页码及其徽标不显示。 在另一个页面中,页码及其徽标在左下角上下颠倒显示 知道原因吗 下面的代码,谢谢Java Apache PDFBox PDPageContentStream showText和drawImage有时不';不工作或显示颠倒,java,pdf-generation,pdfbox,Java,Pdf Generation,Pdfbox,问候,, 我有一个功能,将页码和徽标放在右上方。 代码在几乎每一页都能正常工作。 但是,在某些页面中,页码及其徽标不显示。 在另一个页面中,页码及其徽标在左下角上下颠倒显示 知道原因吗 下面的代码,谢谢 private byte[] setPageNumbers(byte[] pdftmp, Integer initialPage, Integer finalPage) throws IOException { ByteArrayOutputStream baos = new B
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();
}
private byte[]setPageNumber(byte[]pdftmp,Integer initialPage,Integer finalPage)引发IOException{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
PDDocument document=PDDocument.load(pdftmp);
PDPage;
字符串numberingFormat=“{0}”;
int offset_X=45;
int offset_Y=803;
int page_计数器=1;
颜色=新颜色(0);
float[]components=newfloat[]{color.getRed()/255f,color.getGreen()/255f,color.getBlue()/255f};
浮动x;
浮动y;
PDPageContentStream-contentStream;
页面大小;
字符串文本;
PDImageXObject pdImage;
对于(inti=initialPage;i我用这种方法求解
...
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));
}
...
A您使用的是MediaBox。改用CropBox。B考虑页面旋转。谢谢mkl。我发现一些页面是字母,而不是A4。您是对的,旋转角度是180°。我将尝试将180°页面或字母页面的内容转换为新的180°A4页面,然后将新页面旋转到0°。谢谢!!