itext或itextsharp-在现有PDF中移动文本

问题描述 投票:1回答:2

我的目标是在一定矩形区域内的PDF中移动文本。在stackoverflow上有一个现有的Item,这已经使我接近实现这一目标:iText or iTextSharp rudimentary text edit

但是,我将回到一个非常基本的水平上来处理PDF。有没有机会使用更高级别的itext来更改文本的位置?恐怕没有简单的解决方案,但是我很乐意得到一些建议。

PS:还请记住,我只想在矩形区域内移动文本,即与原始PDF区域匹配的文本(块)应在其x和y坐标中进行一些移动。我对PDF的创建方式没有任何影响,我可以接受只能模糊地工作的解决方案。

pdf itextsharp itext editing
2个回答
2
投票

我以为我理解了您的问题,但是您对我的反问的回答令人困惑,所以让我举一个例子,在我解释它时回答您的问题。

假设您有这样的文字:“在此处输入图像描述”

我还有一个矩形的坐标:new Rectangle(100, 500, 200, 600);和一个偏移量:将矩形中的所有内容向左移动10个点,向底部移动2个点,如下所示:

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS8wYTFEMy5wbmcifQ==” alt =“在此处输入图像描述”>

这相当容易实现。看一下CutAndPaste示例:

public void manipulatePdf(String src, String dest)
    throws IOException, DocumentException {
    // Creating a reader
    PdfReader reader = new PdfReader(src);
    // step 1
    Rectangle pageSize = reader.getPageSize(1);
    Rectangle toMove = new Rectangle(100, 500, 200, 600);
    Document document = new Document(pageSize);
    // step 2
    PdfWriter writer
        = PdfWriter.getInstance(document, new FileOutputStream(dest));
    // step 3
    document.open();
    // step 4
    PdfImportedPage page = writer.getImportedPage(reader, 1);
    PdfContentByte cb = writer.getDirectContent();
    PdfTemplate template1 = cb.createTemplate(pageSize.getWidth(), pageSize.getHeight());
    template1.rectangle(0, 0, pageSize.getWidth(), pageSize.getHeight());
    template1.rectangle(toMove.getLeft(), toMove.getBottom(),
            toMove.getWidth(), toMove.getHeight());
    template1.eoClip();
    template1.newPath();
    template1.addTemplate(page, 0, 0);
    PdfTemplate template2 = cb.createTemplate(pageSize.getWidth(), pageSize.getHeight());
    template2.rectangle(toMove.getLeft(), toMove.getBottom(),
            toMove.getWidth(), toMove.getHeight());
    template2.clip();
    template2.newPath();
    template2.addTemplate(page, 0, 0);
    cb.addTemplate(template1, 0, 0);
    cb.addTemplate(template2, -20, -2);
    // step 4
    document.close();
    reader.close();
}

如果这不是您想要的。如果您想检测实际单词并移动这些单词,那么您会遇到问题。在那种情况下,我们正在谈论的一个项目可能很容易花费几个月的工作才能正确地完成,而您的简短问题将在很大程度上不足以知道在可以想象的许多极端情况下该怎么做。


0
投票

上面相同的代码,但是在C#中,带有名称空间:

        // Creating a reader
        iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(src);

        // step 1
        Rectangle pageSize = reader.GetPageSize(1);
        Rectangle toMove = new Rectangle(100, 500, 200, 600);
        Document document = new Document(pageSize);

        // step 2
        iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, new FileStream(dest, FileMode.Create));

        // step 3
        document.Open();

        // step 4
        iTextSharp.text.pdf.PdfImportedPage page = writer.GetImportedPage(reader, 1);
        iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
        iTextSharp.text.pdf.PdfTemplate template1 = cb.CreateTemplate(pageSize.Width, pageSize.Height);

        template1.Rectangle(0, 0, pageSize.Width, pageSize.Height);
        template1.Rectangle(toMove.Left, toMove.Bottom, toMove.Width, toMove.Height);
        template1.EoClip();
        template1.NewPath();
        template1.AddTemplate(page, 0, 0);

        iTextSharp.text.pdf.PdfTemplate template2 = cb.CreateTemplate(pageSize.Width, pageSize.Height);

        template2.Rectangle(toMove.Left, toMove.Bottom, toMove.Width, toMove.Height);
        template2.Clip();
        template2.NewPath();
        template2.AddTemplate(page, 0, 0);
        cb.AddTemplate(template1, 0, 0);
        cb.AddTemplate(template2, -20, -2);

        // step 5
        document.Close();
        reader.Close();
© www.soinside.com 2019 - 2024. All rights reserved.