Itextsharp:如何在添加新样式时避免替换现有线条样式?

问题描述 投票:0回答:1

我正在使用iText将服装标签生成为pdf。我正在尝试在每页中添加虚线作为折叠线。但是,当我添加虚线时,现有的笔触会替换为虚线吗?知道如何停止吗?

我在创建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();
}

我希望在给定纵坐标的每页中都写虚线。但是它变成了将直线替换为虚线。知道如何在不替换现有行的情况下添加行吗?

c# itext
1个回答
0
投票

线破折号(就像线宽,填充和笔触颜色以及许多其他属性一样,是“ pdf图形状态”的一部分。

要恢复较早的图形状态,pdf支持一堆图形状态。当当前状态是您以后想要返回的状态时,可以将当前状态压入该堆栈。当您想回到该状态时,可以将其从堆栈中弹出。

用于推送的指令称为保存状态,用于弹出还原状态的指令。匹配的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();
© www.soinside.com 2019 - 2024. All rights reserved.