首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache PDFBox PDPageContentStream showText和drawImage有时无法工作或显示颠倒

Apache PDFBox PDPageContentStream showText和drawImage有时无法工作或显示颠倒
EN

Stack Overflow用户
提问于 2020-08-27 01:53:21
回答 1查看 310关注 0票数 0

问候,我有一个功能,把页码和标志在右上角。这段代码几乎在每一页都能正常工作。但是,在某些页面中,页码及其徽标不会显示。在另一页中,页码及其徽标在左下角颠倒显示。

有关于原因的想法吗?

代码如下,谢谢。

代码语言:javascript
复制
    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();
}
EN

回答 1

Stack Overflow用户

发布于 2020-08-29 00:08:27

我用这种方法解决了..。

代码语言:javascript
复制
...
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));
}
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63603179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档