当前位置: 首页 > 知识库问答 >
问题:

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

淳于哲
2023-03-14

我使用PDFBox 1.8.8并尝试将新文本添加到现有的pdf文件中,问题是我添加的文本正在寻找此特定pdf的压缩

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

(它正在为其他PDF工作)。

问题的图像与解释

它最初并没有显示出来,但我修复了这个问题(设置字体显示模式)

content.appendRawCommands("0 Tr ");  

我在使用pdf矩阵,检查了几乎所有的东西。。。我不知道该怎么解决这个问题。。。

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

问题:

1)是否有任何方法来强制pdfbox使用正常的字体设置,并忽略当前页面上的字体选项

2) 有没有办法读取当前的字体设置,或者播放内容。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个答案

宦砚
2023-03-14

我用PDFDebugger看了你的结果PDF,它在页面的流数组中有两个流,第二个流是“批准”的东西。所以你能做的就是把原始流括在q...... q中保存和恢复设置。我试着用NOTEpad在PDF中编辑它(我首先用WriteDecodedDoc命令行实用程序解压缩它)。

还有其他可能比我的回答更好的策略,例如分层,或者使用透明图像(例如RubberStampWithImage)。

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

 类似资料:
  • 我的问题是:我有两个标签。 我的目标是单击只包含单词“word”而不包含“microsoft word”的标签。 所以我做了这个: 但是这种方法让我点击包含“单词”的标签,而不等于“单词”,所以我点击的标签是第一个,而不是我想要的第二个。 我必须找到一种方法来检查等式,但我没有找到。 我能怎么办?

  • 问题内容: 我正在寻找有关如何在JPanel中绘制文本的最基本描述。我知道那里有十亿个教程,但是没有一个在我身边点击,我有一些具体的问题可能会帮助其他困惑的人。作为设置(测试应用程序),我有一个类,其中包含JLabel,JTextField,JButton和JPanel。该应用程序从一个外部文件中读取整数,并且在按下JButton时应在面板中显示其平均值。我已经整理了所有基础编程(即按钮响应并将平

  • 希望你们中有人能告诉我为什么我的这个ffmpeg命令没有画出想要的文本。制作的视频没有。给你: 你觉得对吗?如果是这样,那么为什么我在videoMail_preview.webm视频文件中看不到任何文本呢? 在这里使用FFMPEGV2.8.6,启用了--enable-libfreetype、--enable-libfontconfig和--enable-libfribidi。 此外,上面的命令是用

  • 背景 我一直在开发一个程序,它可以获取一个pdf,突出显示一些单词(通过pdfbox标记注释)并保存新的pdf。 为此,我扩展了PDFTextStripper类,以覆盖writeString()方法并获取每个单词(框)的TextPositions,这样我就可以准确地知道文本在PDF文档中的坐标位置(TextPosition对象为我提供每个单词框的坐标)。然后,在此基础上,我画了一个矩形,突出显示我

  • 我的目的是绘制一个上传的图像,我不知道的尺寸在一个PDF文件的一个空页(DINA4)。对于水平图像,我有一个带有一个水平空页的PDF文件,对于垂直图像,我有一个带有一个垂直页的PDF文件。 这是我到目前为止的代码: 对于垂直图像,一切工作都很好(我更希望图像在页面的中心,但这将是下一步)。

  • 问题内容: 假设我有一个包含以下内容的文本文件: 有什么方法可以编辑该文本文件中的特定行?现在我有这个: 是的,我知道那是不正确的。但是你明白我的意思吧?我正在尝试通过用法师替换战士来编辑第2行。但是我还能做到吗? 问题答案: 您想做这样的事情: 这样做的原因是您不能直接在文件中执行“更改第2行”之类的操作。您只能覆盖(而不是删除)文件的某些部分- 这意味着新内容仅覆盖旧内容。因此,如果您在第2行