如何嵌入来自其他 PDF iText 7 的所有字体

David Piao

我正在尝试使用 iText7/C# 覆盖两个 PDF 文件。第一个是背景,第二个是包含表单字段。一切正常,唯一的问题是我丢失了第二个文件中的字体。

我尝试如下:

static public bool Overlay(string back_path, string front_path, string merge_path)
{
    PdfReader reader;
    PdfDocument pdf = null, front;
    try
    {
        reader = new PdfReader(back_path);
        pdf = new PdfDocument(reader, new PdfWriter(merge_path));
        front = new PdfDocument(new PdfReader(front_path));

        var form = PdfAcroForm.GetAcroForm(front, false);
        PdfAcroForm dform = PdfAcroForm.GetAcroForm(pdf, true);
        IDictionary<String, PdfFormField> fields = form.GetFormFields();

        // copy styles
        dform.SetDefaultResources(form.GetDefaultResources());
        dform.SetDefaultAppearance(form.GetDefaultAppearance().GetValue());

        // do overlay
        foreach (KeyValuePair<string, PdfFormField> pair in fields)
        {
            try
            {
                var field = pair.Value;
                PdfPage page = field.GetWidgets().First().GetPage();

                int pg_no = front.GetPageNumber(page);
                if (pg_no < front_start_page || pg_no > front_end_page)
                    continue;
                PdfObject copied = field.GetPdfObject().CopyTo(pdf, true);
                PdfFormField copiedField = PdfFormField.MakeFormField(copied, pdf);

                // The following returns null. If it returns something, I think I could use copiedField.setFont(font). 
                // var font = field.GetFont(); 

                dform.AddField(copiedField, pdf.GetPage(pg_no));
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"Overlaying field {pair.Key} failed. ({ex.Message})");
            }
        }

        pdf.Close();
        return true;
    }
    catch (Exception ex)
    {
        throw new OverlayException(ex.Message);
    }
}

public static PdfDictionary get_font_dict(PdfDocument pdfDoc)
{
    PdfDictionary acroForm = pdfDoc.GetCatalog().GetPdfObject().GetAsDictionary(PdfName.AcroForm);
    if (acroForm == null)
    {
        return null;
    }
    PdfDictionary dr = acroForm.GetAsDictionary(PdfName.DR);
    if (dr == null)
    {
        return null;
    }
    PdfDictionary font = dr.GetAsDictionary(PdfName.Font);
    return font;
}

所以基本上我从第二个 PDF 中获取所有字体并将它们复制到最终的 PDF。但它不起作用。

从逻辑上讲,我认为将原始字段的字体设置为复制的字体是正确的方法。我的意思是 PdfFormField.GetFont() 和 SetFont()。但它总是返回空值。

马克尔

在评论中,您澄清了:

可以假设背景 PDF 没有表单字段或注释。我的意思是我们可以假设背景 PDF 只包含静态内容(扫描表单),而前面的 PDF 只包含表单域。

在这种情况下,实现您的方法的最简单方法是将背景作为 xobject 添加到表单 PDF,而不是将表单添加到背景 PDF。

你可以简单地这样做:

PdfReader formReader = new PdfReader(front_path);
PdfReader backReader = new PdfReader(back_path);
PdfWriter writer = new PdfWriter(merge_path);

using (PdfDocument source = new PdfDocument(backReader))
using (PdfDocument target = new PdfDocument(formReader, writer))
{
    PdfFormXObject xobject = source.GetPage(1).CopyAsFormXObject(target);
    PdfPage targetFirstPage = target.GetFirstPage();
    PdfStream stream = targetFirstPage.NewContentStreamBefore();
    PdfCanvas pdfCanvas = new PdfCanvas(stream, targetFirstPage.GetResources(), target);
    Rectangle cropBox = targetFirstPage.GetCropBox();
    pdfCanvas.AddXObject(xobject, cropBox.GetX(), cropBox.GetY());
}

根据背景和表单 PDF 的确切静态内容,您可能想要使用NewContentStreamAfter代替NewContentStreamBefore甚至使用一些漂亮的混合模式来获得您想要的确切静态内容外观。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用 iText 7 删除 PDF 文件中的重复字体

来自分类Dev

itext 7 c# 如何剪辑现有的 pdf

来自分类Dev

从Word导出PDF并嵌入所有字体

来自分类Dev

在Itext中修改现有PDF的字体

来自分类Dev

如何使用iText 7将PDF写入HttpResponseMessage

来自分类Dev

使用Itext找出未在PDf中嵌入字体的位置或页面

来自分类Dev

在pdf文档itext7中获取所有acrosfields的可用信息

来自分类Dev

如何在Stamper中使用Verdana字体(iText PDF)

来自分类Dev

如何在Stamper中使用Verdana字体(iText PDF)

来自分类Dev

如何使用 IText7 和 C# 在现有 PDF 中的内部链接下划线?

来自分类Dev

Itext7 pdf.version.not.valid

来自分类Dev

iText 7:如何构建混合不同字体的段落?

来自分类Dev

iText 7如何在整个文档中设置字体

来自分类Dev

如何使用iText7将.p7s字节数组插入PDF?

来自分类Dev

如何更改所有书签属性以使用itext继承现有pdf的缩放

来自分类Dev

如何使用iText在所有文档页面中显示数字PDF签名?

来自分类Dev

如何使用iText返回PDF

来自分类Dev

在iText7(.NET)中将页脚添加到现有PDF的每一页

来自分类Dev

在自定义签名中使用字体带有iText7的外观签名会破坏PDF / A一致性吗?

来自分类Dev

在自定义签名中使用字体带有iText7的外观签名会破坏PDF / A一致性吗?

来自分类Dev

在Itext 7中,如何使用2个步骤对pdf进行签名?

来自分类Dev

如何使用iText 7在PDF文件中添加复选框?

来自分类Dev

如何在itext7 html到pdf转换器的converterproperties中设置baseuri

来自分类Dev

如何使用itext7从标记的pdf中的结构元素中提取文本

来自分类Dev

我如何使用itext7从存储在Blob存储中的pdf中提取文本?

来自分类Dev

在itext 7中将html转换为pdf时如何继续特定div标签的横向?

来自分类Dev

如何使用带有 C# 的 itext7 将 u3d 添加到现有的 pdf 中

来自分类Dev

如何使用iText和XMLWorker生成有效的PDF / A文件(HTML到PDF / A进程)

来自分类Dev

如何在(pdf)TeX的Linux上创建和安装TrueType字体的所有相关字体度量和字体映射?

Related 相关文章

  1. 1

    如何使用 iText 7 删除 PDF 文件中的重复字体

  2. 2

    itext 7 c# 如何剪辑现有的 pdf

  3. 3

    从Word导出PDF并嵌入所有字体

  4. 4

    在Itext中修改现有PDF的字体

  5. 5

    如何使用iText 7将PDF写入HttpResponseMessage

  6. 6

    使用Itext找出未在PDf中嵌入字体的位置或页面

  7. 7

    在pdf文档itext7中获取所有acrosfields的可用信息

  8. 8

    如何在Stamper中使用Verdana字体(iText PDF)

  9. 9

    如何在Stamper中使用Verdana字体(iText PDF)

  10. 10

    如何使用 IText7 和 C# 在现有 PDF 中的内部链接下划线?

  11. 11

    Itext7 pdf.version.not.valid

  12. 12

    iText 7:如何构建混合不同字体的段落?

  13. 13

    iText 7如何在整个文档中设置字体

  14. 14

    如何使用iText7将.p7s字节数组插入PDF?

  15. 15

    如何更改所有书签属性以使用itext继承现有pdf的缩放

  16. 16

    如何使用iText在所有文档页面中显示数字PDF签名?

  17. 17

    如何使用iText返回PDF

  18. 18

    在iText7(.NET)中将页脚添加到现有PDF的每一页

  19. 19

    在自定义签名中使用字体带有iText7的外观签名会破坏PDF / A一致性吗?

  20. 20

    在自定义签名中使用字体带有iText7的外观签名会破坏PDF / A一致性吗?

  21. 21

    在Itext 7中,如何使用2个步骤对pdf进行签名?

  22. 22

    如何使用iText 7在PDF文件中添加复选框?

  23. 23

    如何在itext7 html到pdf转换器的converterproperties中设置baseuri

  24. 24

    如何使用itext7从标记的pdf中的结构元素中提取文本

  25. 25

    我如何使用itext7从存储在Blob存储中的pdf中提取文本?

  26. 26

    在itext 7中将html转换为pdf时如何继续特定div标签的横向?

  27. 27

    如何使用带有 C# 的 itext7 将 u3d 添加到现有的 pdf 中

  28. 28

    如何使用iText和XMLWorker生成有效的PDF / A文件(HTML到PDF / A进程)

  29. 29

    如何在(pdf)TeX的Linux上创建和安装TrueType字体的所有相关字体度量和字体映射?

热门标签

归档