Как можно создавать абзацы без указания точной координаты каждого в SharpPDF? - PullRequest
2 голосов
/ 06 мая 2011

Могу ли я добавить абзацы с помощью SharpPDF без указания точных координат?Разве я не могу просто поместить один абзац под другой?

Скажите, пожалуйста, использовали ли вы библиотеку.

1 Ответ

1 голос
/ 27 августа 2011

Невозможно просто добавлять абзацы один за другим без указания координат, однако я написал этот пример, который переместит абзацы вниз по странице и при необходимости создаст новую страницу. В этом случае вы можете написать текст, абзацы, рисунок и всегда знать положение «курсора».

const int WIDTH = 500;
const int HEIGHT = 792;

pdfDocument myDoc;
pdfPage currentPage;

private void button1_Click(object sender, EventArgs e)
{
    int height = 0;

    myDoc = new pdfDocument("TUTORIAL", "ME");
    currentPage = myDoc.addPage(HEIGHT, WIDTH);

    string paragraph1 = "All the goats live in the land of the trees and the bushes, " 
        + " when a person lives in the land of the trees and the bushes they wonder about the sanity" 
        + " of it all. Whatever.";

    string paragraph2 =  "Redwood National and State Parks is located in northernmost coastal "
        + "California — about 325 miles north of San Francisco, Calif. Roughly 50 miles long, the parklands"
        + "stretch from near the Oregon border in the north to the Redwood Creek watershed southeast of"
        + "Orick, Calif. Five information centers are located along this north-south corrdior. Park "
        + "Headquarters is located in Crescent City, Calif. (95531) at 1111 Second Street.";

    int iYpos = HEIGHT;

    for (int ix = 0; ix < 10; ix++)
    {
        height = GetStringHeight(paragraph1, new Font("Helvetica", 12), WIDTH);
        iYpos = CheckHeight(height, iYpos);
        currentPage.addParagraph(paragraph1, 0, iYpos, sharpPDF.Enumerators.predefinedFont.csHelvetica, 12, WIDTH);
        iYpos -= height;

        height = GetStringHeight(paragraph2, new Font("Helvetica", 12), WIDTH);
        iYpos = CheckHeight(height, iYpos);
        currentPage.addParagraph(paragraph2, 0, iYpos, sharpPDF.Enumerators.predefinedFont.csHelvetica, 12, WIDTH);
        iYpos -= height;
    }

    string tmp = Path.GetFileNameWithoutExtension(Path.GetTempFileName()) + ".pdf";
    myDoc.createPDF(tmp);
}

private int GetStringHeight(string text, Font font, int width)
{
    Bitmap b = new Bitmap(WIDTH, HEIGHT);
    Graphics g = Graphics.FromImage((Image)b);
    SizeF size = g.MeasureString(text, font, (int)Math.Ceiling((float)width / 72F * g.DpiX));
    return (int)Math.Ceiling(size.Height)
}

private int CheckHeight(int height, int iYpos)
{
    if (height > iYpos)
    {
        currentPage = myDoc.addPage(HEIGHT, WIDTH);
        iYpos = HEIGHT;
    }
    return iYpos;
}

Y в этом API - назад, поэтому 792 - это ТОП, а 0 - это ДНО. Я использую объект Graphics для измерения высоты строки, так как Graphics - в пикселях, а Pdf - в точках, и я делаю оценку, чтобы сделать их похожими. Затем я вычитаю высоту из моего оставшегося значения Y.

В этом примере я продолжаю добавлять paragraph1 и paragraph2 снова и снова, обновляя свою позицию Y по мере продвижения вперед. Когда я добираюсь до конца страницы, я создаю новую страницу и сбрасываю свою позицию Y.

Этот проект не видел обновлений в течение ряда лет, но исходный код доступен, используя что-то похожее на то, что я сделал, вы можете создать свою собственную функцию, которая позволит вам последовательно добавлять абзацы будет отслеживать позицию курсора, где он думает, что что-то должно идти дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...