Itextsharp: Как избежать замены существующего стиля линии при добавлении нового? - PullRequest
0 голосов
/ 10 октября 2019

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

Я пытался добавить пунктирные линии при создании PDF и после создания PDF. Но ни одна из этих работ.

Это мой код.

string inputPDF = "C:\\Users\\User\\Documents\\visual studio 2017\\Projects\\iTextSharpExample\\iTextSharpExample\\pdf\\Label_dynamicLive_SampleTemplate.pdf";
string outputPDF = "C:\\Users\\User\\Documents\\visual studio 2017\\Projects\\iTextSharpExample\\iTextSharpExample\\pdf\\Label_dynamicLive_SampleTemplate_foldline.pdf";
PdfReader reader = new PdfReader(inputPDF);

using (var fileStream = new FileStream(outputPDF, FileMode.Create, FileAccess.Write))
{
    var document = new Document(reader.GetPageSizeWithRotation(1));
    var writer = PdfWriter.GetInstance(document, fileStream);

    document.Open();

    for (var i = 1; i <= reader.NumberOfPages; i++)
    {
        document.NewPage();

        var baseFont = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
        var importedPage = writer.GetImportedPage(reader, i);

        var contentByte = writer.DirectContent;

    //line start
    float moveto_x = 0 + 1;
    float lineto_x = 20 - 1;
    float moveto_y = (110 / 2) + 5;
    float lineto_y = (110 / 2) + 5;

    float moveto_x2 = 0 + 1;
    float lineto_x2 = 20 - 1;
    float moveto_y2 = (110 / 2) - 5;
    float lineto_y2 = (110 / 2) - 5;


    float lineWidth = 0.5f;
    float unitsOn = 5;
    float unitsOff = 1;
    float phase = 2;

    moveto_x = iTextSharp.text.Utilities.MillimetersToPoints(moveto_x);
    moveto_y = iTextSharp.text.Utilities.MillimetersToPoints(moveto_y);
    contentByte.MoveTo(moveto_x, moveto_y);
    lineto_x = iTextSharp.text.Utilities.MillimetersToPoints(lineto_x);
    lineto_y = iTextSharp.text.Utilities.MillimetersToPoints(lineto_y);
    contentByte.LineTo(lineto_x, lineto_y);
    contentByte.SetLineWidth(lineWidth);
    contentByte.SetLineDash(unitsOn, unitsOff, phase);
    contentByte.Stroke();
    //line end



    contentByte.AddTemplate(importedPage, 0, 0);
    }

    document.Close();
    writer.Close();
}

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

1 Ответ

0 голосов
/ 22 октября 2019

Черта линии (как и ширина линии, цвета заливки и обводки и многие другие свойства) является частью "графического состояния pdf".

Чтобы вернуть более раннее графическое состояние, PDF-файлы поддерживаютстек графических состояний. Когда текущее состояние - это то, к чему вы хотите вернуться позже, вы помещаете текущее состояние в этот стек. И когда вы хотите вернуться в это состояние, вы извлекаете его из этого стека.

Инструкция для нажатия называется save-state, инструкция для выталкивания восстановленного состояния. Подходящими методами PdfContentByte являются SaveState() и RestoreState().

Таким образом, начните с contentByte.SaveState(), затем сделайте свое дело, затем завершите contentByte.RestoreState().


Добавьте в сторону, ваш код генерирует инструкции в недопустимом порядке:

contentByte.MoveTo(moveto_x, moveto_y);
contentByte.LineTo(lineto_x, lineto_y);
contentByte.SetLineWidth(lineWidth);
contentByte.SetLineDash(unitsOn, unitsOff, phase);
contentByte.Stroke();

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

Большинство зрителей PDF не настаивают на этом, поэтому, вероятно, у вас не будет конкретных проблем из-за этого.

Но если ваши PDF-файлы проверены, этот неверный порядок может быть указан как ошибка.

Таким образом, сначала задайте параметры, затем создайте путь и нарисуйте его.

contentByte.SaveState();
contentByte.SetLineWidth(lineWidth);
contentByte.SetLineDash(unitsOn, unitsOff, phase);
contentByte.MoveTo(moveto_x, moveto_y);
contentByte.LineTo(lineto_x, lineto_y);
contentByte.Stroke();
contentByte.RestoreState();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...