itext или itextsharp - переместить текст в существующий PDF

Моя цель - переместить текст в PDF, который находится внутри определенной прямоугольной области. Существует существующий элемент в стеке потока, который уже приблизил меня к достижению этого: элементарное редактирование текста iText или iTextSharp

Тем не менее, я вернусь к управлению PDF на самом базовом уровне. Есть ли возможность использовать более высокий уровень возможностей itext, чтобы изменить положение текста? Боюсь, что нет простого решения, но я был бы рад получить некоторые предложения.

PS: Также имейте в виду, что я хочу перемещать только текст в прямоугольной области, то есть текст (куски), совпадающий с областью в оригинальном PDF, должен быть немного смещен в своих координатах x и y. Я не имею никакого влияния на то, как создается PDF, и я могу принять решение, которое работает только смутно.

1 ответ

Решение

Я думал, что понял ваш вопрос, но ваш ответ на мой встречный вопрос сбивает с толку, поэтому позвольте мне привести вам пример, который отвечает на ваш вопрос, когда я его интерпретирую.

Предположим, у вас есть такой текст:

У меня также есть координаты прямоугольника: new Rectangle(100, 500, 200, 600); и смещение: переместите все в этом прямоугольнике на 10 точек влево и 2 точки вниз, например:

Это довольно легко достичь. Взгляните на пример 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();
}

Если это не то, что вы хотите. Если вы хотите обнаружить реальные слова и переместить эти слова, то у вас есть проблема. В этом случае мы говорим о проекте, который может легко потратить пару месяцев работы, чтобы сделать это правильно, и ваш короткий вопрос будет в значительной степени недостаточным, чтобы знать, что делать во многих крайних случаях, которые можно вообразить.

Тот же код выше, но на 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();
Другие вопросы по тегам