Вы не можете прочитать файл и записать в него одновременно. Подумайте, как работает Word: вы не можете открыть документ Word и написать прямо на него. Word всегда создает временный файл, записывает изменения в него, затем заменяет исходный файл и затем удаляет временный файл.
Вы можете сделать это:
- читать исходный файл с
PdfReader
,
- создать временный файл для
PdfStamper
, и когда вы закончите,
- заменить исходный файл с временным файл.
Или:
- читать исходный файл в
byte[]
,
- создать
PdfReader
с этим byte[]
и
- использовать путь к исходному файлу для
PdfStamper
.
Этот второй вариант более опасен, поскольку вы потеряете исходный файл, если вы делаете что-то, что вызывает исключение в PdfStamper
.
Что касается добавления контента с помощью PdfStamper
, ознакомьтесь с разделом «Управление существующими PDF-файлами» в бесплатной электронной книге The Best iText Questions on StackOverflow. Вы найдете такие вопросы, как:
Все эти примеры добавить содержимое, создавая PdfContentByte
экземпляр так:
PdfContentByte canvas = stamper.getOverContent(pagenumber);
Это canvas
, которую вы должны использовать при рисовании круга на странице с номером страницы pagenumber
. Важно, чтобы вы использовали правильные координаты, когда вы это делаете.Вот объясняется здесь: How to position text relative to page using iText?
Update:
Json не разместил следующий код в комментариях:
string oldFile = @"C:\Users\ae40394\Desktop\hello.pdf";
string newFile = @"C:\Users\ae40394\Desktop\NEW.pdf";
// creating a reader with the original PDF
PdfReader reader = new PdfReader(oldFile);
Rectangle rect = reader.GetPageSize(1);
FileStream fs = new FileStream(newFile,FileMode.Create);
using (PdfStamper stamper = new PdfStamper(reader, fs)) {
// modify the pdf content
PdfContentByte cb = stamper.GetOverContent(1);
cb.SetColorStroke(iTextSharp.text.BaseColor.GREEN);
cb.SetLineWidth(5f);
cb.Circle(rect.GetLeft() + 30, rect.GetBottom() + 30 ,20f);
cb.Stroke();
}
reader.Close();
File.Replace(@"C:\Users\ae40394\Desktop\NEW.pdf", @"C:\Users\ae40394\Desktop\hello.pdf", @"C:\Users\ae40394\Desktop\hello.pdf.bac");
я немного адаптировал код, потому что:
- Существует нет потребность в объекте
Document
,
stamper
закрыт, когда using
закрыт,
- Когда
stamper
закрыт, так что это FileStream
- координаты окружности были жестко закодированы. Я использовал размер страницы, чтобы убедиться, что они сделаны относительно происхождения системы координат, хотя, конечно, вы также можете проверить, есть ли Crop Box.
Вы должны указать свой точный вопрос, прежде чем ваш вопрос закрывается как «слишком широким». – vib
Я хочу изменить pdf, добавив в него круг, текущее решение связано с созданием нового PDF (Itextsharp). Можно ли добавить круг в PDF без создания нового? – Json
Редактировать свой вопрос, чтобы уточнить его, и лучше также добавить несколько строк кода, который вы пробовали ..! – TaW