使用java

时间:2016-04-26 08:53:08

标签: java itext

我需要在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链接: -

下载链接:https://www.send18.com/?uid=a89d-403ee175 密码:9mbBvqwY

代码无法更改,因为它已在许多地方编写,而且只更改一个pdf的代码没有意义。 请告知可能出现的问题。

1 个答案:

答案 0 :(得分:1)

你正在混合两种不同的东西。

你可以拥有:

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);

后者是前者的简写。

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查看器的(所有版本)都会忽略该错误。