gpt4 book ai didi

c# - Ver 5.5.4+ 中的 ItextSharp 字体颜色问题

转载 作者:行者123 更新时间:2023-11-30 20:44:38 28 4
gpt4 key购买 nike

我有一些使用红色字体颜色创建红色“印章”的代码:

    string StampDate = DateTime.Now.ToString("MM/dd/yyyy");
string FontPath = Server.MapPath("/assets/Fonts");
string OrigFile = Server.MapPath("/test.pdf");
const int OpacityPercent = 80;
const float PDFPaidFontSize = 28;
const float PDFCopyX = 170;
const float PDFPaidX = 385;
const float PDFY = 20;
const float PDFDateXOffset = 7;
const float PDFDateYOffset = 12;
const float PDFDateFontSize = 10;
const string PaidStampTxt = "PAID";
const string CopyStampTxt = "COPY";
const string ArialFilename = "arialbd.ttf";
PdfStamper stamper = null;
PdfReader reader = null;
PdfReader.unethicalreading = true;
MemoryStream streamPDF;
try
{
reader = new PdfReader(OrigFile);
streamPDF = new MemoryStream();
stamper = new PdfStamper(reader, streamPDF);
for (int i = 1; i <= reader.NumberOfPages; i++)
{
PdfGState gstate = new PdfGState();
gstate.FillOpacity = gstate.StrokeOpacity = OpacityPercent / 100F;
PdfContentByte overContent = stamper.GetOverContent(i);
overContent.SaveState();
overContent.SetGState(gstate);
overContent.SetColorFill(BaseColor.RED);
overContent.BeginText();
BaseFont font = BaseFont.CreateFont(BaseFont.TIMES_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
overContent.SetFontAndSize(font, PDFPaidFontSize);
overContent.ShowTextAligned(PdfContentByte.ALIGN_LEFT, CopyStampTxt, PDFCopyX, PDFY, 0);
overContent.ShowTextAligned(PdfContentByte.ALIGN_LEFT, PaidStampTxt, PDFPaidX, PDFY, 0);
overContent.SetColorFill(BaseColor.BLACK);
font = BaseFont.CreateFont(Path.Combine(FontPath, ArialFilename), BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
overContent.SetFontAndSize(font, PDFDateFontSize);
overContent.ShowTextAligned(PdfContentByte.ALIGN_LEFT, StampDate, PDFPaidX + PDFDateXOffset, PDFY - PDFDateYOffset, 0);
overContent.EndText();
overContent.RestoreState();
}
}
finally
{
if (stamper != null)
{
stamper.Close();
}
if (reader != null)
{
reader.Close();
}
}
byte[] pdf = streamPDF.ToArray();
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Buffer = false;
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.Charset = string.Empty;
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", pdf.Length.ToString());
Response.AddHeader("Content-Disposition", "inline;filename=test.pdf;");
Response.BinaryWrite(pdf);
Response.Close();

生成的 pdf 文本具有灰色而不是红色。
当我恢复到 5.5.3 版时,它再次显示为红色。我已经尝试过 5.5.4 和 5.5.5,它们似乎都有同样的问题。

我的问题是:这是一个错误还是我需要将我的代码更改为更新的代码?

编辑:这似乎只是某些 pdf 文件的问题。更改字体和 pdf 文件版本似乎没有效果。

比较有效的 pdf 和无效的 pdf(我都不能公开分享),我注意到无效的 pdf 是带标签的 pdf,启用了快速 Web View ,并且由 adobe pdf 库生成。可以工作的 pdf 不是带标签的 pdf,没有启用快速 Web View ,并且由 itextsharp 创建。

由于我无法控制源 pdf 文件的内容,因此我恢复到似乎一直都可以使用的早期版本的 itextsharp。

最佳答案

第一次尝试重现该问题

我刚刚为这些值执行了您的代码:

        int OpacityPercent = 70;
int PDFPaidFontSize = 20;
string CopyStampTxt = "COPY";
string PaidStampTxt = "PAID";
int PDFCopyX = 100;
int PDFPaidX = 250;
int PDFY = 500;
string FontPath = @"C:\Windows\Fonts";
string ArialFilename = "ariali.ttf";
int PDFDateFontSize = 30;
string StampDate = "TODAY";
int PDFDateXOffset = 0;
int PDFDateYOffset = 35;

使用简单的源 PDF,结果 PDF 如下所示:

enter image description here

与你的观察相反

The resulting pdf text has a gray color instead of red.



生成的文本颜色偏红(白底部分透明的红色)。

我使用 iTextSharp 5.5.5 进行了测试。

因此,要获得灰色而不是红色,您的变量值或源 PDF 必须有一些特殊之处,这不是一般的 iTextSharp 问题。

使用 OP 提供的文件重现问题

在第一次尝试重现该问题后,OP 提供了一个示例文件 Test.pdf ,实际上,对于这个文件,相同代码的结果是:

enter image description here

因此,确实存在问题。

分析

两种情况下添加的内容流操作的比较显示:
  • 第一次尝试使用我的示例 PDF:
    /Xi0 gs
    1 0 0 rg
    BT
    /Xi1 20 Tf
    1 0 0 1 100 500 Tm
    (COPY) Tj
  • 使用 OP 的示例文件进行第二次尝试:
    /Xi0 gs
    1 0 0 rg
    BT
    0 g
    /Xi1 20 Tf
    1 0 0 1 100 500 Tm
    (COPY) Tj

  • 因此,尽管使用了相同的代码,但还有一个额外的 0 g后一种情况下的操作,并且该操作选择黑色作为填充颜色。

    这真是出乎意料。因此,我查看了 iText 代码和代码历史以获得解释(我选择了 iText/Java 代码,因为这是进行原始开发的地方,并且可以更彻底地检查更改)。

    确实, PdfContentByte.beginText以。。结束:
    if (isTagged()) {
    try {
    restoreColor();
    } catch (IOException ioe) {

    }
    }

    背景

    因此,在标记 PDF 的情况下,此方法“重置颜色”。为什么?

    查看代码历史会给出一些提示
  • 修订版 5499 标记的 PDF 支持:将图形和文本保存在一个 Canvas 中。还没准备好...
  • 修订版 5515 现在 iText 可以将文本和图形写入 1 个 Canvas 。为此,您应该将 PdfDocument.putTextAndGraphicsTogether 设置为 true。

    这里首先出现的上面的 block 略有不同
    if (autoControlTextBlocks) {
    try {
    restoreColor();
    } catch (IOException ioe) {

    }
    }

    即这里的颜色只有在 autoControlTextBlocks 时才会恢复。是 true .
  • ...
  • 修订版 5533 writer.isTagged 属性现在决定是将所有内容写入一个 Canvas 还是单独的 Canvas 。

    这里的标志autoControlTextBlocks替换为 isTagged相关作者的调用。

  • 我的解释:
  • 为了正确支持标记的 PDF,将图形和文本保存在一个 Canvas 中是必要的,或者至少是有利的(以前它们是在不同的 Canvas 中创建的,最终被连接起来,因此相关的图形和文本在内容中彼此远离)。
  • 为了在高级代码中以最小的开销将图形和文本保持在一起,新的 自动控制文本 block 模式已添加到 PdfContentByte它会在需要时自动启动和停止文本对象,并为文本保存和恢复单独的颜色集。
  • 这种模式似乎已被选为支持 iText 中标记内容的手段,而它似乎被认为对其他上下文没有用处。因此,此模式现在自动用于标记文件。

  • 在我看来,这个选择不是最优的。 PdfContentByte是公开可用的 iText API 的一部分,它被公开宣传(作为“内容”)用于对生成的或预先存在的 PDF 进行低级调整。引入这样的副作用违反了 API 契约,至少它会妨碍人们升级。

    解决方法

    只需切换颜色设置和文本对象启动操作的顺序,使用
    ...
    overContent.BeginText();
    overContent.SetColorFill(BaseColor.RED);
    ...

    结果是

    enter image description here

    解决

    如果我正确地解释了最终签到,这个问题应该在 iText 版本 5.5.6 中得到修复。

    提交 301a45b57dcef37ae0ec3625fbdd6caaf4004a3a

    删除了 PdfContentByte 类 (DEV-1371) 中为标记的 pdf 文档保存和恢复颜色的已弃用逻辑。

    关于c# - Ver 5.5.4+ 中的 ItextSharp 字体颜色问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29087283/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com