使用 java 中 Itext 5.0 jar 的 ColumnText.showTextAligned 方法将文本添加到 pdf 时出现 pdf 错误
Getting pdf error when adding text to pdf using ColumnText.showTextAligned method of Itext 5.0 jar in java
我需要向 pdf 添加一些文本。我通过创建一个短语并将其传递给 ColumnText.showTextAligned 方法来做到这一点,只有一个特定的 pdf 在查看 pdf 时会出错:-
“此页面存在错误。Acrobat 可能无法正确显示该页面。请联系相关人员...
“
下面是用于添加文本的代码片段:-
PdfReader reader = new PdfReader(pdfBytes);
PdfStamper stamper = new PdfStamper(reader, pdfOutputByteArray);
PdfContentByte page;
FontSelector selector = new FontSelector();
int start = 0;
int n = reader.getNumberOfPages();
BaseFont bf = BaseFont.createFont("GARABD.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font1 = new Font(bf, 12, Font.NORMAL);
selector.addFont(font1);
for (int i = start; i < n + start; i++) {
page = stamper.getOverContent(i - start + 1);
Rectangle rect = reader.getPageSizeWithRotation(i - start + 1);
page.beginText();
page.setFontAndSize(bf, 12);
page.setColorFill(BaseColor.BLACK);
Phrase ph = selector.process(staticText);
ColumnText.showTextAligned(page, Element.ALIGN_RIGHT, ph, rect.getRight(350), rect.getTop(60), 0);
page.endText();
}
当我尝试通过以下方法添加相同的文本时没有出现错误,下面是代码:-
PdfReader reader = new PdfReader(pdfBytes);
PdfStamper stamper = new PdfStamper(reader, pdfOutputByteArray);
PdfContentByte page;
FontSelector selector = new FontSelector();
int start = 0;
int n = reader.getNumberOfPages();
BaseFont bf = BaseFont.createFont("GARABD.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font1 = new Font(bf, 12, Font.NORMAL);
selector.addFont(font1);
for (int i = start; i < n + start; i++) {
page = stamper.getOverContent(i - start + 1);
Rectangle rect = reader.getPageSizeWithRotation(i - start + 1);
page.beginText();
page.setFontAndSize(bf, 12);
page.setColorFill(BaseColor.BLACK);
page.setTextMatrix(rect.getRight(455), rect.getTop(60));
page.showText(staticText);
page.endText();
我想提一下,这种情况只发生在一页的特定 pdf 上。以下是 pdf link:-
下载Link:https://www.send18.com/?uid=a89d-403ee175
密码:9mbBvqwY
代码改不了,因为已经写了很多地方了,而且为了一个pdf改代码也没有意义。
请告知可能是什么问题。
您正在混合两种不同的东西。
你可以选择:
page.beginText();
page.setFontAndSize(bf, 12);
page.setColorFill(BaseColor.BLACK);
page.showTextAligned(Element.ALIGN_RIGHT, "some text", x, y, 0);
page.endText();
或者你可以这样:
Phrase ph = new Phrase("some text");
ColumnText.showTextAligned(page, Element.ALIGN_RIGHT, ph, x, y, 0);
后者是shorthand前者
ColumnText.showTextAligned()
在内部创建一个 beginText()
和 endText()
,所以你有这样的东西:
page.beginText();
page.setFontAndSize(bf, 12);
page.setColorFill(BaseColor.BLACK);
page.beginText();
page.setFontAndSize(bf, 12);
page.showTextAligned(Element.ALIGN_RIGHT, "some text", x, y, 0);
page.endText();
page.endText();
在 PDF 中嵌套文本对象是非法的,这就是导致错误的原因。
我建议您从代码中删除以下行:
page.beginText();
page.setFontAndSize(bf, 12);
page.setColorFill(BaseColor.BLACK);
page.endText();
这应该可以解决问题。
你说你不能更改代码,但你应该。现在 所有 您正在创建的 PDF 都是错误的。在大多数情况下该错误会被忽略,但不能保证所有 PDF 查看器(所有版本)都会忽略该错误。
我需要向 pdf 添加一些文本。我通过创建一个短语并将其传递给 ColumnText.showTextAligned 方法来做到这一点,只有一个特定的 pdf 在查看 pdf 时会出错:- “此页面存在错误。Acrobat 可能无法正确显示该页面。请联系相关人员... “ 下面是用于添加文本的代码片段:-
PdfReader reader = new PdfReader(pdfBytes);
PdfStamper stamper = new PdfStamper(reader, pdfOutputByteArray);
PdfContentByte page;
FontSelector selector = new FontSelector();
int start = 0;
int n = reader.getNumberOfPages();
BaseFont bf = BaseFont.createFont("GARABD.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font1 = new Font(bf, 12, Font.NORMAL);
selector.addFont(font1);
for (int i = start; i < n + start; i++) {
page = stamper.getOverContent(i - start + 1);
Rectangle rect = reader.getPageSizeWithRotation(i - start + 1);
page.beginText();
page.setFontAndSize(bf, 12);
page.setColorFill(BaseColor.BLACK);
Phrase ph = selector.process(staticText);
ColumnText.showTextAligned(page, Element.ALIGN_RIGHT, ph, rect.getRight(350), rect.getTop(60), 0);
page.endText();
}
当我尝试通过以下方法添加相同的文本时没有出现错误,下面是代码:-
PdfReader reader = new PdfReader(pdfBytes);
PdfStamper stamper = new PdfStamper(reader, pdfOutputByteArray);
PdfContentByte page;
FontSelector selector = new FontSelector();
int start = 0;
int n = reader.getNumberOfPages();
BaseFont bf = BaseFont.createFont("GARABD.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font1 = new Font(bf, 12, Font.NORMAL);
selector.addFont(font1);
for (int i = start; i < n + start; i++) {
page = stamper.getOverContent(i - start + 1);
Rectangle rect = reader.getPageSizeWithRotation(i - start + 1);
page.beginText();
page.setFontAndSize(bf, 12);
page.setColorFill(BaseColor.BLACK);
page.setTextMatrix(rect.getRight(455), rect.getTop(60));
page.showText(staticText);
page.endText();
我想提一下,这种情况只发生在一页的特定 pdf 上。以下是 pdf link:-
下载Link:https://www.send18.com/?uid=a89d-403ee175 密码:9mbBvqwY
代码改不了,因为已经写了很多地方了,而且为了一个pdf改代码也没有意义。 请告知可能是什么问题。
您正在混合两种不同的东西。
你可以选择:
page.beginText();
page.setFontAndSize(bf, 12);
page.setColorFill(BaseColor.BLACK);
page.showTextAligned(Element.ALIGN_RIGHT, "some text", x, y, 0);
page.endText();
或者你可以这样:
Phrase ph = new Phrase("some text");
ColumnText.showTextAligned(page, Element.ALIGN_RIGHT, ph, x, y, 0);
后者是shorthand前者
ColumnText.showTextAligned()
在内部创建一个 beginText()
和 endText()
,所以你有这样的东西:
page.beginText();
page.setFontAndSize(bf, 12);
page.setColorFill(BaseColor.BLACK);
page.beginText();
page.setFontAndSize(bf, 12);
page.showTextAligned(Element.ALIGN_RIGHT, "some text", x, y, 0);
page.endText();
page.endText();
在 PDF 中嵌套文本对象是非法的,这就是导致错误的原因。
我建议您从代码中删除以下行:
page.beginText();
page.setFontAndSize(bf, 12);
page.setColorFill(BaseColor.BLACK);
page.endText();
这应该可以解决问题。
你说你不能更改代码,但你应该。现在 所有 您正在创建的 PDF 都是错误的。在大多数情况下该错误会被忽略,但不能保证所有 PDF 查看器(所有版本)都会忽略该错误。