iTextSharp Как добавить элемент в PdfStamper.getOverContent
Что я должен сделать
Я пишу тесты и в настоящее время пытаюсь проверить, правильно ли проставлен штамп PDF на первой странице. Для этого я попытался найти на странице текст штампа, который не работал, потому что оказалось, что этот штамп не находится на текстовом слое или что-то еще. Короче говоря: я не знаю, где искать марку.
Что делает служба штамповки
PdfStamper = new PdfStamper(Stamper.mPDFSource, Stamper.mStreamOut);
PdfContentByte canvas = stamper.GetOverContent(mPage);
PdfPTable table = new PdfPTable(1);
table.SetTotalWidth(new float[] { table_width });
Font cellFont = new Font(Font.FontFamily.HELVETICA, mFontSize, Font.NORMAL, textcolor);
Phrase phrase = new Phrase(cell_text, cellFont);
PdfPCell cell = new PdfPCell(phrase);
table.AddCell(cell);
table.WriteSelectedRows(0, strRows.Length, xpos, ypos, canvas);
Что я думаю узнать
- Потоки, которые я прочитал, говорят мне, что марки, созданные таким образом, в основном становятся аннотациями. Я еще не нашел пример, где таблица используется, хотя.
- Если предыдущий верен, почему следующий возвращает нуль? Это было названо решением в разных потоках.
,
PdfReader.GetPdfObject(pdfDictionary.Get(PdfName.ANNOTS));
PdfReader.GetPdfObject(pdfDictionary.Get(PdfName.ANNOT));
pdfDictionary.GetAsArray(PdfName.ANNOT);
pdfDictionary.GetAsArray(PdfName.ANNOTS);
iTextSharp: 5.3.5.0.Net: 4.0
Где / как я могу найти марки?
С наилучшими пожеланиями
1 ответ
Если вы просто добавляете текст и / или изображения, то вы сможете изучить обычный текстовый поток. Я думаю, что выполненные вами поиски дали результаты аннотации, потому что вы говорите о "марках", которые являются типом аннотации, но вы их не используете. Вы используете PdfStamper
изменить существующий документ.
Ниже приведен полностью рабочий пример, который демонстрирует, как создать базовый PDF, затем измените его, добавив таблицу с уникальной строкой и, наконец, выполнив поиск в PDF уникальной строки. Надеюсь, комментарии в коде должны все объяснить. Пожалуйста, обратите внимание на предупреждение внизу тоже.
/* Setup */
//Test files
var file1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "file1.pdf");
var file2 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "file2.pdf");
//Stamp Text
var stampText = "**UNIQUE_STAMP_TEXT**";
/* Step 1 */
//Create a basic simple file, nothing special here
using (var fs = new FileStream(file1, FileMode.Create, FileAccess.Write, FileShare.None)) {
using (var doc = new Document()) {
using (var writer = PdfWriter.GetInstance(doc, fs)) {
doc.Open();
doc.Add(new Paragraph("Hello World"));
doc.Close();
}
}
}
/* Step 2 */
//Create our second file based on the first file
using (var reader = new PdfReader(file1)) {
using (var fs = new FileStream(file2, FileMode.Create, FileAccess.Write, FileShare.None)) {
using (var stamper = new PdfStamper(reader, fs)) {
//Get the raw content stream "above" the existing content
var canvas = stamper.GetOverContent(1);
//Create a basic single column table
var table = new PdfPTable(1);
table.SetTotalWidth(new float[] { 500 });
var cellFont = new iTextSharp.text.Font(iTextSharp.text.Font.FontFamily.HELVETICA, 10, iTextSharp.text.Font.NORMAL, BaseColor.RED);
//Add our special stamp text
table.AddCell(new PdfPCell(new Phrase(stampText, cellFont)));
//Draw the table onto the canvas
table.WriteSelectedRows(0, 1, 50, 50, canvas);
}
}
}
/* Step 3 */
//Search the previously created PDF for the given string
bool hasStampText = false;
using (var reader = new PdfReader(file2)) {
var text = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(reader, 1);
//WARNING: PdfPTable will wrap text if needed. Unless you can gaurantee that your text fits into the provided cell
// you might want to have some additional logic to search for your unique string.
hasStampText = text.Contains(stampText);
}