【问题标题】:PDFBox scrambling the textPDFBox加扰文本
【发布时间】:2013-10-31 09:28:07
【问题描述】:

我一直在尝试编辑 PDF 文档以预先填写表单条目。我已经让它工作了(有点)。我要添加的文本很好。但是,已经存在的其他文本似乎已被替换为“&%£!£!符号。我发现这与下面代码中的“contentStream”部分有关。它似乎是“ setFont" 行。如果我删除它,页面仍然正常...除了不再显示 "Hello Richard" 文本!

请帮忙!

package pdfboxtest;

import java.awt.Color;
import java.util.List;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;

public class PDFFormFiller {

    private static final String R40_NEW_FORM_PATH = "c:\\temp\\hmrc-r40.pdf";
    private static final String R40_COMPLETED_FORM_PATH = "c:\\temp\\hmrc-r40-complete.pdf";

    public static void main(String[] args) throws Exception {
        PDDocument doc = PDDocument.load(R40_NEW_FORM_PATH);

        addTextToPage(doc);

        doc.save(R40_COMPLETED_FORM_PATH);
        doc.close();
    }

    private static void addTextToPage(PDDocument doc) throws Exception {
        List pages = doc.getDocumentCatalog().getAllPages();
        PDPage firstPage = (PDPage) pages.get(0);
        PDPageContentStream contentStream = new PDPageContentStream(doc, firstPage, true, true);

        contentStream.setFont(PDType1Font.HELVETICA_BOLD, 24);
        contentStream.beginText();
        contentStream.setNonStrokingColor(Color.BLACK);
        contentStream.moveTextPositionByAmount(100, 200);
        contentStream.drawString("HELLO RICHARD!!");
        contentStream.endText();
        contentStream.close();

    }
}

【问题讨论】:

  • Longshot 但是您是否尝试过像这样从系统加载字体? PDFont 字体 = PDTrueTypeFont.loadTTF(文档,“C:\\Windows\\Fonts\\segoepr.ttf”);
  • 这绝对值得一试!谢谢,但没有运气:-(
  • 这可能是由于我在 this answer 中描述的解决方法的 PDFBox 问题。

标签: java pdf pdfbox


【解决方案1】:

正如评论中已经假设的那样,这是由于我在this answer 中描述的解决方法的 PDFBox 问题。此问题仍然存在于 PDFBox 1.8.2 版中,但同时有已针对版本 1.8.3 和 2.0.0 进行了修复,参见PDFBOX-1753.

在您的情况下,解决方法会像这样更改 addTextToPage 方法:

private static void addTextToPage(PDDocument doc) throws IOException {
    List pages = doc.getDocumentCatalog().getAllPages();
    PDPage firstPage = (PDPage) pages.get(0);
    PDPageContentStream contentStream = new PDPageContentStream(doc, firstPage, true, true);

    firstPage.getResources().getFonts(); // <<<<<<

    contentStream.setFont(PDType1Font.HELVETICA_BOLD, 24);
    contentStream.beginText();
    contentStream.setNonStrokingColor(Color.BLACK);
    contentStream.moveTextPositionByAmount(100, 200);
    contentStream.drawString("HELLO RICHARD!!");
    contentStream.endText();
    contentStream.close();
}

添加的行强制执行 new PDPageContentStream 忘记但 setFont 指望已经完成的初始化。您可以在上面引用的答案中找到详细信息。您可能想通知 PDFBox 开发。

【讨论】:

  • 太棒了!谢谢你。我可以向您保证,我确实在 StackOverflow 上进行了一些搜索,但我可能没有正确评估您给我的答案。哇,多么棘手的小问题!
猜你喜欢
  • 2017-03-22
  • 2013-06-27
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多