加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用PDFBox将标题添加到现有PDF文件

发布时间:2020-12-15 04:14:27 所属栏目:Java 来源:网络整理
导读:我正在尝试将标头添加到现有的PDF文件中.它可以工作,但现有PDF中的表头由字体的变化搞砸了.如果我删除设置字体,则标题不会显示.这是我的代码: // the document PDDocument doc = null; try { doc = PDDocument.load( file ); List allPages = doc.getDocume
我正在尝试将标头添加到现有的PDF文件中.它可以工作,但现有PDF中的表头由字体的变化搞砸了.如果我删除设置字体,则标题不会显示.这是我的代码:

// the document
    PDDocument doc = null;
    try
    {
        doc = PDDocument.load( file );

        List allPages = doc.getDocumentCatalog().getAllPages();
        //PDFont font = PDType1Font.HELVETICA_BOLD;

        for( int i=0; i<allPages.size(); i++ )
        {
            PDPage page = (PDPage)allPages.get( i );
            PDRectangle pageSize = page.findMediaBox();
            PDPageContentStream contentStream = new PDPageContentStream(doc,page,true,true);
            PDFont font = PDType1Font.TIMES_ROMAN;
            float fontSize = 15.0f;
            contentStream.beginText();
            // set font and font size
            contentStream.setFont( font,fontSize);
            contentStream.moveTextPositionByAmount(700,1150);
            contentStream.drawString( message);
            contentStream.endText();

            //contentStream.
            contentStream.close();}

        doc.save( outfile );
    }
    finally
    {
        if( doc != null )
        {
            doc.close();
        }
    }
}`

解决方法

基本上,您在当前版本1.8.2中遇到了PDFBox错误.

解决方法:

在使用字体之前,在创建新内容流之后添加页面资源的getFonts调用:

PDPage page = (PDPage)allPages.get( i );
PDRectangle pageSize = page.findMediaBox();
PDPageContentStream contentStream = new PDPageContentStream(doc,true);
page.getResources().getFonts();  // <<<<<<<<
PDFont font = PDType1Font.TIMES_ROMAN;
float fontSize = 15.0f;
contentStream.beginText();

错误本身:

错误在PDResources.addFont方法中,该方法是从PDPageContentStream.setFont调用的:

public String addFont(PDFont font) 
{
    return addFont(font,MapUtil.getNextUniqueKey( fonts,"F" ));
}

它使用fonts成员变量的当前内容来确定手头页面上新字体资源的唯一名称.不幸的是,此成员变量在此时仍然可以(并且在您的情况下)未初始化.这导致MapUtil.getNextUniqueKey(字体,“F”)调用始终返回F0.

然后在稍后的addFont(PDFont,String)调用期间隐式初始化font变量.

因此,如果遗憾的是,该页面上已存在名为F0的字体,则它将替换为新字体.

经过您的PDF测试,这正是您的案例中发生的事情.由于现有字体F0使用一些自定义编码,而替换字体使用标准字体,因此最初使用F0编写的文本现在看起来像乱码.

上面提到的解决方法隐式初始化了该成员变量,因此阻止了字体替换.

如果您计划在生产中使用PDFBox执行此任务,则可能需要报告该错误.

PS:正如上面的评论中所提到的,在继承资源的上下文中还有另一个要观察的错误.它也应该引起PDFBox开发的关注.

PPS:手头的问题已经在PDFBox中针对版本1.8.3和2.0.0进行了修复,参见PDFBOX-1753.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读