Как добавить рамку на страницу с помощью iTextSharp? - PullRequest
8 голосов
/ 14 июня 2011

Можно ли добавить рамку на страницу в документе PDF с помощью iTextSharp?Я создаю файл PDF с нуля, поэтому мне не нужно добавлять границы к уже существующему документу.

Вот мой код, например:

Document pdfDocument = new Document(PageSize.LETTER);
Font headerFont = new Font(baseFont, 13);
Font font = new Font(baseFont, 10);
PdfWriter writer = PdfWriter.GetInstance(pdfDocument, 
                                         new FileStream(fileName, FileMode.Create));
pdfDocument.Open();

//I add IElements here.

pdfDocument.Close();

Ответы [ 3 ]

7 голосов
/ 18 апреля 2012

Вот ответ (адаптированный от Марка Сторера) в C #.В этом примере для рисования границы используются поля страницы, что иногда полезно для отладки макета страницы.

public override void OnEndPage(PdfWriter writer, Document document)
{
    base.OnEndPage(writer, document);

    var content = writer.DirectContent;
    var pageBorderRect = new Rectangle(document.PageSize);

    pageBorderRect.Left += document.LeftMargin;
    pageBorderRect.Right -= document.RightMargin;
    pageBorderRect.Top -= document.TopMargin;
    pageBorderRect.Bottom += document.BottomMargin;

    content.SetColorStroke(BaseColor.RED);
    content.Rectangle(pageBorderRect.Left, pageBorderRect.Bottom, pageBorderRect.Width, pageBorderRect.Height);
    content.Stroke();
}
1 голос
/ 14 июня 2011

Я предлагаю вам получить прямое содержимое текущей страницы при его создании, а также границу с PdfContentByte.

Возможно, вы захотите получить класс PdfPageEventHelper, который рисует в onEndPageevent.

Вы можете запросить текущий размер страницы с помощью параметра document параметра *1007* и использовать его (немного подправив), чтобы нарисовать границы.Учитывая, что вы используете iTextSharp, у вас, вероятно, есть свойство PageSize вместо метода get.

Что-то вроде:

public void onEndPage(PdfWriter writer, Document doc) {
  PdfContentByte content = writer.getDirectContent();
  Rectangle pageRect = doc.getPageSize();

  pageRect.setLeft( pageRect.getLeft() + 10 );
  pageRect.setRight( pageRect.getRight() - 10 );
  pageRect.setTop( pageRect.getTop() - 10 );
  pageRect.setBottom( pageRect.getBottom() + 10 );

  content.setColorStroke( Color.red );
  content.rectangle(pageRect.getLeft(), pageRect.getBottom(), pageRect.getWidth(), pageRect.getHeight());
  content.stroke();
}

Обратите внимание, что вы на самом деле можете передать Rectangle в content.rectangle(), после чего используются настройки границы и заливки этого прямоугольника.Я подумал, что это может немного сбить с толку, поэтому не кодировал это так.

0 голосов
/ 19 февраля 2014

Мне удалось добавить красную рамку к существующему PDF

public void createPdf(PdfReader  pdfReader)
        throws DocumentException, IOException {
    String userDir = System.getProperty("user.dir");
    System.out.println("userDir = " + userDir);
    RESULT  = userDir + "/work/"+"sample.pdf";
    // step 1
    Document document = new Document();
    // step 2
    PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT));

    // step 3
    document.open();
    int noOfPages = pdfReader.getNumberOfPages();
    for (int page = 0; page < noOfPages; ) {
        if(page==0) {
            PdfImportedPage immportedPage = copy.getImportedPage(pdfReader, ++page);
            PageStamp stamp = copy.createPageStamp(immportedPage);
            PdfContentByte canvas = stamp.getOverContent();
            drawPageBorder(canvas, PageSize.A4.getWidth(), PageSize.A4.getHeight());
            stamp.alterContents();
            copy.addPage(immportedPage);
        } else {
            copy.addPage(copy.getImportedPage(pdfReader, ++page));
        }
    }

    copy.freeReader(pdfReader);
    pdfReader.close();
    // step 4
    document.close();
}

public void drawPageBorder(PdfContentByte content, float width, float height) {
    content.saveState();
    PdfGState state = new PdfGState();
    state.setFillOpacity(0.0f);
    content.setGState(state);
    content.setColorStroke(BaseColor.RED);
    content.setLineWidth(6);
    content.rectangle(5, 5, width, height);
    content.fillStroke();
    content.restoreState();
}
...