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

Что я думаю, чтобы узнать

  • Темы, которые я читал, говорят мне, что штампы, созданные таким образом, в основном становятся аннотациями. Однако мне еще предстоит найти пример, где используется таблица.
  • Если предыдущее верно, почему следующее возвращает null? Это было названо решением в разных потоках.

.

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

Где и как найти штампы?

С уважением, Анни


person annih    schedule 23.10.2013    source источник
comment
Треды, которые я читал, говорят мне, что штампы, созданные таким образом, в основном становятся аннотациями. - Эти треды неверны. Материал, добавленный в OverContent, добавляется к содержимому. только как побочный эффект в некоторых особых ситуациях могут быть созданы некоторые аннотации.   -  person mkl    schedule 23.10.2013


Ответы (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);
}
person Chris Haas    schedule 23.10.2013