Garth J Lancaster
У меня нет опыта работы с аннотациями, но часто мне нужно разместить что - то абсолютно на странице, и я использую "поддельную" таблицу. Если вы можете добавить свою аннотацию в "ячейку", а я думаю, что можете, попробуйте сделать это
PdfContentByte cb = writer.DirectContent;
PdfPTable table = new PdfPTable(1);
table.TotalWidth = 400f;
table.AddCell(//Annotation Details Here);
table.WriteSelectedRows(0, -1, 200, 50, cb);
Вы можете установить границы стола на все, что пожелаете, я делаю их невидимыми
Итак, это "основа" моего процесса :-
PdfContentByte cb;
// Create PDF Reader For Input PDF
PdfReader reader = new PdfReader(//Source PDF File Name);
// Create Output PDF
using (System.IO.FileStream fs = new System.IO.FileStream(//Target PDF Output File Name, System.IO.FileMode.Create))
{
// Create PDF Stamper
PdfStamper pdfStamper = new (PdfStamper, fs);
// Get The Content Bytes For Page 1
cb = pdfStamper.GetOverContent(1);
// Not Sure If this is needed
cb.BeginText();
// Create a table and set a width
PdfPTable table = new PdfPTable(1);
table.TotalWidth = 400f;
// Option 1 or Option 2 Here - I usually use 'builder' procedures for Tables/Paragraphs/Cells
// Write the table at an absolute position
table.WriteSelectedRows(0, -1, 200, 50, cb);
// If We've needed to use BeginText() We need this
cb.EndText();
pdfStamper.FormFlattening = true;
// Close Stamper
pdfStamper.Close();
}
Тогда любой из этих двух вариантов
// Option 1 - Using Paragraph + Chunk Allows For Alignment
// Create Chunk with anchor
var webAddress = new Chunk("CodeProject");
// Set The anchor
webAddress.SetAnchor("http://www.codeproject.com");
// Crate a paragraph to hold the chunk
var para = new Paragraph(webAddress);
// Add some alignment to the paragraph
para.Alignment = Element.ALIGN_CENTER;
// Create a cell
PdfPCell anchorCell = new PdfPCell();
// Add the paragraph to the cell
anchorCell.AddElement(para);
// Can set padding on cell :-)
anchorCell.Padding = 30f;
// Set the cell border off
anchorCell.Border = Rectangle.NO_BORDER;
// Add the cell to the table
table.AddCell(anchorCell);
//
или
// Option 2 - Use Chunk, less formatting control
// Create Chunk with anchor
var webAddress = new Chunk("CodeProject");
// Set The anchor
webAddress.SetAnchor("http://www.codeproject.com");
// Create a cell
PdfPCell anchorCell = new PdfPCell();
// Add the webAddress (chunk) to the cell
anchorCell.AddElement(webAddress);
// Set the cell border off
anchorCell.Border = Rectangle.NO_BORDER;
// Add the cell to the table
table.AddCell(anchorCell);
//
Вам нужно будет установить
//Имя исходного PDF-файла
//Целевое имя выходного файла PDF
К значениям для PDF - файла in (я использую его как "подложку") и PDF - файла out
кстати - это набрано из рукописных заметок, я нахожусь на своем mac и в данный момент не могу добраться до своей машины dev, так что, возможно, потребуется немного отредактировать здесь и там
Вы можете скопировать вариант 1 или 2 здесь (или сделать статическую процедуру и передать в cb / ContentBytes
Цитата:
// Вариант 1 или Вариант 2 здесь - я обычно использую процедуры "строителя" для таблиц/абзацев/ячеек
. как говорится, у меня обычно есть набор "строителей", которые позволяют мне собирать шрифты, абзацы из кусков, таблицы из ячеек и т. д
Полный рабочий пример (создание PDF-файла с нуля)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace CPPDF001
{
class Program
{
static void Main(string[] args)
{
BaseFont bfTimesRoman = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false);
Font fTimesRomanItalic10 = new Font(bfTimesRoman, 10, Font.ITALIC, BaseColor.BLACK);
String testPDFName = "CPPFF001.pdf";
if (File.Exists(testPDFName))
{
File.Delete(testPDFName);
}
using (FileStream fs = new FileStream("CPPFF001.pdf", FileMode.Create))
{
Document doc = new Document(PageSize.A4, 25,25,30,30);
PdfWriter writer = PdfWriter.GetInstance(doc, fs);
doc.Open();
PdfContentByte cb = writer.DirectContent;
cb.BeginText();
writeText(cb, "Garth Was Here !!!", 30, 718, bfTimesRoman, 14);
// Note the implications of this wrt chunks in Try 1 and Try 2
cb.SetFontAndSize(bfTimesRoman, 10);
PdfPTable table = new PdfPTable(1);
table.TotalWidth = 400f;
// Try 1 : This works - NB Will Have a Rectangle Around it
// Note that because we're using a chunk, its font/size is
// dependand upon the statement :-
//
// cb.SetFontAndSize(bfTimesRoman, 10);
//
var chunk = new Chunk("CodeProject");
chunk.SetAnchor("http://www.codeproject.com");
chunk.SetUnderline(0.5f, -1.5f);
PdfPCell cell = new PdfPCell();
cell.AddElement(chunk);
table.AddCell(cell);
table.WriteSelectedRows(0, -1, 30, 646, cb);
// Try 1 End
// Try 2 : This also works - NB Will not have a Border/Rectangle Around it
// Note that because we're using a chunk, its font/size is
// dependand upon the statement :-
//
// cb.SetFontAndSize(bfTimesRoman, 10);
//
PdfPTable table1 = new PdfPTable(1);
table1.TotalWidth = 100f;
PdfPCell cell1 = new PdfPCell();
cell1.AddElement(chunk);
cell1.Border = Rectangle.NO_BORDER;
table1.AddCell(cell1);
table1.WriteSelectedRows(0, -1, 30, 574, cb);
// Try 2 End
// Try 3 : This also works
// NB Will not have a Border/Rectangle Around it
// Will Be In Italic, No Underline
PdfPTable table2 = new PdfPTable(1);
table2.TotalWidth = 100f;
PdfPCell cell2 = new PdfPCell();
// Note the chunk formatting here :-)
var chunk1 = new Chunk("CodeProject", fTimesRomanItalic10);
chunk1.SetAnchor("http://www.codeproject.com");
//var paragraph = new Paragraph(chunk1);
cell2.AddElement(chunk1);
cell2.Border = Rectangle.NO_BORDER;
table2.AddCell(cell2);
table2.WriteSelectedRows(0, -1, 30, 502, cb);
// Try 3 End
cb.EndText();
doc.Close();
} // using
} // Main
static void writeText(PdfContentByte cb, string text, int x, int y, BaseFont font, int size)
{
cb.SetFontAndSize(font, size);
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, x, y, 0);
}
// Obviously you'd re-factor Try1-3 Into Code that looked like
/*
static Chunk CreateChunk(string text,
string link,
Font font,
int fontSize)
{
// Create and return Chunk
}
static PDFPCell CreateCell(Chunk chunk,
bool borderOrNot)
{
// Create and return Cell, using chunk
}
static Table CreateTable(PDFPcell cell,
int rectangleSize)
{
// Create and return Table
}
static void AddAnnotation(PdfContentByte cb,
string text,
string link,
Font font,
int fontSize,
int positionX,
int positionY,
bool borderOrNot,
int rectangleSize)
{
// Build Chunk using text, link, font, fontSize
// Build Cell, Add Chunk To Cell And Turn Border Off if borderOrNot == true
// Build Table, set width to rectangleSize
// Write Table to cb, positionX, positionY
}
*/
}
}
}
Полный рабочий пример (аннотирование существующего PDF-файла)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace CPPDF001
{
class Program
{
static void Main(string[] args)
{
BaseFont bfTimesRoman = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false);
Font fTimesRomanItalic10 = new Font(bfTimesRoman, 10, Font.ITALIC, BaseColor.BLACK);
//
// ** Part 1 - Create a PDF to Stamp/Annotate **
//
String testPDFName = "CPPDF001.pdf";
if (File.Exists(testPDFName))
{
File.Delete(testPDFName);
}
// Create a simple PDF to use for Underlay
using (FileStream fs = new FileStream(testPDFName, FileMode.Create))
{
Document doc = new Document(PageSize.A4,