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