gpt4 book ai didi

java - 使用 PDFBox 将页眉添加到现有 PDF 文件

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:11:27 30 4
gpt4 key购买 nike

我正在尝试向现有 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,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, page, true, true,true);
page.getResources().getFonts(); // <<<<<<<<
PDFont font = PDType1Font.TIMES_ROMAN;
float fontSize = 15.0f;
contentStream.beginText();

错误本身:

错误出现在从 PDPageContentStream.setFont 调用的方法 PDResources.addFont 中:

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

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

font 变量随后在 addFont(PDFont, String) 调用期间隐式初始化。

因此,如果不幸的是该页面上已经存在名为 F0 的字体,它将被新字体替换。

使用您的 PDF 进行测试后,这正是您的情况。由于现有字体 F0 使用一些自定义编码,而您的替换字体使用标准编码,因此最初使用 F0 编写的文本现在看起来像乱码。

上述解决方法隐式初始化了该成员变量,因此阻止了字体替换。

如果您计划在生产环境中为此任务使用 PDFBox,您可能需要报告错误。

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

PPS:手头的问题已在 PDFBox 1.8.3 和 2.0.0 版本中得到修复,参见。 PDFBOX-1753 .

关于java - 使用 PDFBox 将页眉添加到现有 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19322553/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com