生成的pdf中的文本相反

时间:2017-10-25 04:58:48

标签: pdf grails pdfbox

我正在使用pdfbox向pdf文件添加一行。但我补充的文字是相反的。

File file = new File(filePath);
PDDocument document = PDDocument.load(file);

PDPage page = document.getPage(0);
PDPageContentStream contentStream = new PDPageContentStream(document, page,PDPageContentStream.AppendMode.APPEND,true);

int stampFontSize = grailsApplication.config.pdfStamp.stampFontSize ? grailsApplication.config.pdfStamp.stampFontSize : 20
contentStream.beginText();
contentStream.setFont(PDType1Font.TIMES_ROMAN, stampFontSize);

int leftOffset = grailsApplication.config.pdfStamp.leftOffset ? grailsApplication.config.pdfStamp.leftOffset : 10
int bottomOffset = grailsApplication.config.pdfStamp.bottomOffset ? grailsApplication.config.pdfStamp.bottomOffset : 20
contentStream.moveTextPositionByAmount(grailsApplication.config.xMove,grailsApplication.config.yMove)
contentStream.newLineAtOffset(leftOffset, bottomOffset)

String text = "i have added this line...!!!!";
contentStream.showText(text);
contentStream.endText();

contentStream.close();

document.save(new File(filePath));
document.close();

byte[] pdfData;
pdfData = Files.readAllBytes(file.toPath());
return pdfData;

我尝试使用moveTextPositionByAmount方法,但这似乎对文本没有任何影响。为什么我的文字被颠倒了,我怎么能把它设置为正确的方向。

Please see the image of pdf output

1 个答案:

答案 0 :(得分:2)

您的代码本身并未导致镜像输出,因此原因必须在您要标记的PDF内部。很遗憾,您没有提供有问题的PDF,因此我们必须在此猜测。

最有可能的问题是由于预先存在的页面内容已将当前转换矩阵设置为镜像仿射转换而不在最后重置它。

如果确实如此,PDFBox提供了一种简单的解决方法:

您可以像这样构建PDPageContentStream

PDPageContentStream contentStream = new PDPageContentStream(document, page,PDPageContentStream.AppendMode.APPEND,true);

还有另一个构造函数接受另一个boolean参数。如果您使用该构造函数将附加参数设置为true,则PDFBox会尝试重置内容的图形状态:

PDPageContentStream contentStream = new PDPageContentStream(document, page,PDPageContentStream.AppendMode.APPEND,true,true);

注意:如果这确实解决了问题,那么您当前使用的坐标和偏移依赖于变换矩阵按原样更改。在这种情况下,您必须相应地更新它们。

或者,引入反镜像可能有助于,例如通过在每个文本对象的开头设置这样的文本矩阵:

contentStream.beginText();
contentStream.setTextMatrix(new Matrix(1f, 0f, 0f, -1f, 0f, 0f));

此后,所有 y 坐标更改都需要取消,特别是contentStream.moveTextPositionByAmountcontentStream.newLineAtOffset的第二个参数。

(顺便说一下,moveTextPositionByAmountnewLineAtOffset做同样的事情,前者只是不推荐使用的变种,所以你可能想在两种情况下使用后者。)