Pdfbox仅在特定文件中不绘制文本

时间:2014-12-23 09:18:15

标签: pdf pdfbox

我使用PDFBox 1.8.8并尝试将新文本添加到现有的pdf文件中。问题是我添加的文本看起来正在压缩这个特定的pdf

original pdf(我认为这个文件是问题的根源)

(它适用于其他pdf)。

image of problem with explanation

最初没有显示,但我修复了这个推荐(设置字体显示模式)

的问题
content.appendRawCommands("0 Tr ");  

我正在使用pdf矩阵并检查几乎所有内容......并且看不出如何解决问题......

content.setTextMatrix(1, 0, 0, 1, 0, 0);

的问题:

1)是否有办法强制pdfbox使用普通字体设置并忽略页面上当前的字体选项

2)有没有办法读取当前的字体设置,也许可以使用content.setTextMatrix(有高度和宽度)播放

3)我的pdf中使用了什么模式来存档这种类型的转换......

我的代码

private static void writePdfBoxStamp(PDDocument document, int page,
        float topLeftX, float topLeftY, float width, float height,
        String text, float  itemFontSize, int[] color, int rotation) throws IOException {

    PDPage pdfPage = (PDPage) document.getDocumentCatalog().getAllPages().get(page);
    PDPageContentStream content = new PDPageContentStream(document, pdfPage, true, true);


    // COSDictionary pageFonts = pdfPage.getResources().getCOSDictionary();


    //border draw
    float lineWidth = 2;

    float bottomLeftX = topLeftX;
    float bottomLeftY = topLeftY - height;
    float topRightX = topLeftX + width;
    float topRightY = topLeftY;

    float radius = 10;

    content.setLineWidth(lineWidth);
    content.setStrokingColor(new Color(color[0], color[1], color[2]));


    content.setNonStrokingColor(new Color(color[0], color[1], color[2]));

    PDFont font = PDType1Font.HELVETICA_BOLD;
    int fontSize = (int) itemFontSize;


    float linesHeight = font.getFontDescriptor().getFontBoundingBox()
            .getHeight()
            / 1000 * fontSize;
    float txtLineWidth = font.getStringWidth(text)
            / 1000 * fontSize;

    content.setFont(font, fontSize);

    content.beginText();

    content.setFont(font, fontSize);

    float  posTextX = topLeftX + (width-txtLineWidth)/2;
    float  posTextY = topLeftY  - height/2 - linesHeight/2 + lineWidth;



    if (rotation > 0) {
        int  step = 0;
        // clockwise rotation
        if (rotation == 90) {
            step = 6;
            posTextX = topLeftX + (width + linesHeight)/2 - lineWidth;
            posTextY = topLeftY - (height + txtLineWidth)/2;
        }
        if (rotation == 270) {
            step = -6;
            posTextX = topLeftX + (width - linesHeight/2)/2;
            posTextY = topLeftY - (height - txtLineWidth)/2;
        }
        content.setTextRotation(-step*Math.PI*0.25, posTextX, posTextY);

    } else {
        content.moveTextPositionByAmount(posTextX,posTextY);

    }

    content.appendRawCommands("0 Tr "); //set normal text procession

    content.drawString(text);


    content.endText();

    content.stroke();


    content.close();
}

1 个答案:

答案 0 :(得分:0)

我用PDFDebugger查看了你的结果PDF,它在页面的流数组中有两个流,第二个流是"已批准"事情。所以你可以做的是将原始流封装在q ....中以保存和恢复设置。我通过使用NOTEPAD ++在PDF中编辑来尝试它(我首先使用WriteDecodedDoc命令行实用程序对其进行解压缩。)

还有其他策略可能比我的回复更好,例如: LayerUtility,或使用透明图像(RubberStampWithImage示例)。

更新: 我看到你在JIRA问了同样的问题,安德烈亚斯的答案也很好: https://issues.apache.org/jira/browse/PDFBOX-2581