在itext中将文本设置在扫描的文档上

时间:2016-12-13 10:26:29

标签: image itext

我已经对这个主题进行了大量的研究,但我发现的每一件事都是使用了压模的功能getOverContent"。我做了这个,它仍然无法正常工作。

我制作了一个程序,它将一个剧目的PDF合并在一起,而不是对这个新文档进行分页(我希望你能按照我写的内容)。原始PDF是自制的(直接保存为PDF格式)或不是(扫描的)。那些最后的那些有麻烦的那个。分页显示在第一,但不在秒(它可能存在,但它应该在图像后面)!

以下是分页的代码,有人有想法,我错了吗?

PdfReader reader = new PdfReader(source);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destination));
    for (int i = start + 1; i <= reader.getNumberOfPages(); i++) {
        Phrase noPage = new Phrase((i - start) + "", new Font(FontFamily.COURIER, 14));
        float x = reader.getPageSize(i).getRight(20);
        float y = reader.getPageSize(i).getTop(20);

        PdfContentByte content = stamper.getOverContent(i);
        content.beginText();
        ColumnText.showTextAligned(content,Element.ALIGN_CENTER, noPage, x, y, 0);
        content.endText();
    }
    stamper.close();
    reader.close();

由于

在布鲁诺回答之后,我做了以下事情:

PdfReader reader = new PdfReader(source); PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(destination));

for (int i = start + 1; i <= reader.getNumberOfPages(); i++) {
    Phrase noPage = new Phrase((i - start) + "", new Font(FontFamily.COURIER, 14));
    float x = reader.getCropBox(i).getRight(20);
        float y = reader.getCropBox(i).getTop(20);

        PdfContentByte content = stamper.getOverContent(i);
        ColumnText.showTextAligned(content,Element.ALIGN_CENTER, noPage, x, y, 0);
    }
    stamper.close();
    reader.close();

但它还没有工作

例如:https://www.transfernow.net/24axn1g4wq4l

1 个答案:

答案 0 :(得分:0)

  

原始PDF是自制的(直接保存为PDF格式)或不是(扫描的)。那些最后的那些有麻烦的那个。分页显示在第一,但不在秒(它可能存在,但它应该在图像后面)!

问题不在于第二种类型的PDF是扫描,而是它使用页面旋转

当页面旋转时,iText会在欠内容和超量内容的开头插入坐标系旋转指令,以确保在旋转的页面上直接显示任何未经进一步转换绘制的文本。

在选择绝对坐标时,显然需要考虑坐标系的这种旋转。

因此,而不是

reader.getPageSize(i)

你应该使用

reader.getPageSizeWithRotation(i)

或者,您可以使用

切换此iText机制
stamper.setRotateContents(false);

然后在以下所有操作中明确考虑页面旋转的存在。