【问题标题】:Apache PDFBox PDPageContentStream showText and drawImage sometimes don't work or show upside downApache PDFBox PDPageContentStream showText 和 drawImage 有时不起作用或显示颠倒
【发布时间】:2020-12-15 13:57:01
【问题描述】:

问候, 我有一个将页码和徽标放在右上角的功能。 该代码几乎在每个页面中都可以正常工作。 但是,在某些页面中,页码及其徽标不显示。 在其他页面中,页码及其徽标倒置显示在左下角。

知道原因吗?

下面的代码,谢谢。

    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();
}

【问题讨论】:

  • A 您使用 MediaBox。请改用 CropBoxB 考虑页面旋转。
  • 谢谢 mkl。我发现有些页面是 Letter,而不是 A4。你是对的,旋转是 180°。我将尝试将 180° 页面或 Letter 页面的内容放入新的 180° A4 页面,然后将新页面旋转到 0°。谢谢!!

标签: java pdf-generation pdfbox


【解决方案1】:

我是这样解决的……

...
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));
}
...

【讨论】:

    猜你喜欢
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多