带iText7 PDFXFA的嵌入式字体

时间:2019-01-02 22:40:58

标签: itext7

我试图在购买许可证之前确定iText7是否可用于解决Dynamic XFA文档的问题。经过一段时间的努力之后,该寻求帮助了。没有许可证,我无权访问iText支持论坛或某些可能包含答案的开发人员资源。

Original XFA Document

Flattened document by iText

下面的代码利用iText提供的examples之一来展平文档。它成功地拉平了文档,但没有嵌入字体,导致字段标题自动换行。原始源文档使用Courier字体,而Ubuntu中的查看器将其映射到Helvetica。

我们将使用XPDF pdftotext将这些文档转换为文本,然后我们将解析字段以获取数据。目前,包裹的标题正在破坏我们的提取程序。解决方案是要么嵌入正确的字体,要么只是调整字体大小,以使标题不换行。

package jumpstart;      
import com.itextpdf.licensekey.LicenseKey;
import com.itextpdf.tool.xml.xtra.xfa.MetaData;
import com.itextpdf.tool.xml.xtra.xfa.XFAFlattener;
import com.itextpdf.tool.xml.xtra.xfa.XFAFlattenerProperties;
import com.itextpdf.tool.xml.xtra.xfa.font.XFAFontSettings;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

import org.apache.log4j.PropertyConfigurator;


public class FlattenXfaDocument2  {
    public static final String XFA = "/home/test1/SPE7L117D0013SPE7L119F9216.PDF";
    public static final String DEST = "/home/test1/SPE7L117D0013SPE7L119F9216_flat_test.PDF";


    public static void main(String args[]) throws Exception {
        String log4jConfPath = "/huge/eclipseworkspace/slf4j-1.7.25/slf4j-ext/src/test/resources/log4j.properties";
        PropertyConfigurator.configure(log4jConfPath);

        FlattenXfaDocument flatty = new FlattenXfaDocument();

        flatty.beforeManipulatePdf();
        flatty.manipulatePdf(DEST);
        new FlattenXfaDocument().manipulatePdf(DEST);

    }


    private List<String> javascriptEvents;

    //@Override
    protected void beforeManipulatePdf() {
        LicenseKey.loadLicenseFile("/home/bootzero/itextkey1544036601345_0.xml");

        //new FontProgramFactory().registerSystemFontDirectories();
        this.javascriptEvents = new ArrayList<>();

        this.javascriptEvents.add("click");
    }

    //@Override
    protected  void manipulatePdf(String dest) throws Exception {

        Map<String, String> fontMapping = new HashMap<String, String>();
        fontMapping.put("Helvetica", "Courier");

        XFAFlattenerProperties flattenerProperties = new XFAFlattenerProperties()
                .setPdfVersion(XFAFlattenerProperties.PDF_1_7)
                .createXmpMetaData()
                .setTagged()
                .setMetaData(
                        new MetaData()
                            .setAuthor("iText Samples")
                            .setLanguage("EN")
                            .setSubject("Showing off our flattening skills")
                            .setTitle("Flattened XFA"));
        //flattenerProperties.setXFAFontSettings(new XFAFontSettings(fontMapping));



        XFAFlattener xfaf = new XFAFlattener()
                .setFontSettings(new XFAFontSettings().setFontSubstitutionMap(fontMapping).setEmbedExternalFonts(true).setFontsPath("/usr/share/fonts/"))
                .setExtraEventList(this.javascriptEvents)
                .setFlattenerProperties(flattenerProperties)
                .setViewMode(XFAFlattener.ViewMode.SCREEN);


        xfaf.flatten(new FileInputStream(XFA), new FileOutputStream(dest));
    }

看起来setEmbedExternalFonts()应该可以解决问题,但是我只能找到对该方法的引用,但没有关于它的作用或工作方式的详细信息。有人可以告诉我我在这里想念的吗?

0 个答案:

没有答案