我使用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();
}
答案 0 :(得分:0)
我用PDFDebugger查看了你的结果PDF,它在页面的流数组中有两个流,第二个流是"已批准"事情。所以你可以做的是将原始流封装在q ....中以保存和恢复设置。我通过使用NOTEPAD ++在PDF中编辑来尝试它(我首先使用WriteDecodedDoc命令行实用程序对其进行解压缩。)
还有其他策略可能比我的回复更好,例如: LayerUtility,或使用透明图像(RubberStampWithImage示例)。
更新: 我看到你在JIRA问了同样的问题,安德烈亚斯的答案也很好: https://issues.apache.org/jira/browse/PDFBOX-2581