【问题标题】:iTextSharp edit a PDF, but the cannot see new added objectsiTextSharp 编辑 PDF,但看不到新添加的对象
【发布时间】:2013-07-27 02:54:50
【问题描述】:

PDF 文件的图层似乎很少,我无法绘制新的对象叠加。我曾尝试使用 PDFStamper 和 GetOverContent() 将对象置于最顶层,但失败了,我不知道为什么。我只想将所有对象添加到 PDF 的最顶层。有可能吗?

如何在 PDF 的顶层添加所有新对象?

这是我的代码:

public static bool SaveFile(string srcFile, string DesFile, List<EditPage> pageLs, List<PdfObj> atOtherLs)
    {
        PdfReader reader = new PdfReader(srcFile);

        Document doc = new Document();
        MemoryStream ms = new MemoryStream();
        PdfWriter writer = PdfWriter.GetInstance(doc, ms);
        doc.Open();
        PdfContentByte cb = writer.DirectContent;

        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            iTextSharp.text.Rectangle ps = reader.GetPageSize(i);


            PdfImportedPage page = writer.GetImportedPage(reader, i);
            EditPage ep = GetEditPage(pageLs, atOtherLs, i - 1);



            WriteEditePage(doc, cb, ps, ep);
        }

        reader.Close();
        doc.Close();

        File.WriteAllBytes(DesFile, ms.ToArray());
        ms.Close();

        return true;
    }


public static void WriteEditePage(Document doc, PdfContentByte cb, Rectangle ps, EditPage ep)
    {
        for (int i = 0; i < ep.Objs.Count; i++)
        {
            if (ep.Objs[i].PdfType != PdfObjTypes.Gdi)
                continue;

            GdiObj gdi = ep.Objs[i] as GdiObj;

            cb.SetColorStroke(new Color(gdi.Color));
            cb.SetColorFill(new Color(gdi.Color));
            cb.SetLineWidth(gdi.Thick / FV);
            if (gdi.Dash != System.Drawing.Drawing2D.DashStyle.Solid)
            {
                cb.SetLineDash(2, 0.75f);
            }
            else
            {
                cb.SetLineDash(1);
            }

            switch (gdi.GdiType)
            {
                case GdiObjTypes.Points:
                    WritePoints(cb, ps, gdi as GdiPoint);
                    break;
                case GdiObjTypes.Line:
                    WriteLine(cb, ps, gdi as GdiLine);
                    break;
                case GdiObjTypes.Rectangle:
                    WriteRetangle(cb, ps, gdi as GdiRectangle);
                    break;
                case GdiObjTypes.Ellipse:
                    WriteEllipse(cb, ps, gdi as GdiEllipse);
                    break;
                case GdiObjTypes.Image:
                    WriteImage(cb, ps, gdi as GdiImage);
                    break;
                case GdiObjTypes.Text:
                    WriteText(cb, ps, gdi as GdiText);
                    break;
            }
        }
    }

【问题讨论】:

  • PDFStamper 和 GetOverContent 会比您当前的代码更正确。请提供结果 pdf 说明问题以供检查。

标签: c# overlay itextsharp layer


【解决方案1】:

您使用错误的类向现有 PDF 文档添加内容。请阅读chapter 6 of my book,更具体地说是第 6.3.1 节。当然,这些示例是用 Java 编写的,并且您使用的是 iTextSharp,但是如果您需要 C# 示例,您可以随时在 Sourceforge 上找到它们。

阅读您的代码示例,我不知道 GetEditPage()WriteEditPage() 应该做什么。如果静态 ColumnText.ShowTextAligned() 不能满足您的目的(例如,因为文本未换行),那么您需要创建一个 ColumnText 实例并将内容添加到该实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多