我试图在购买许可证之前确定iText7是否可用于解决Dynamic XFA文档的问题。经过一段时间的努力之后,该寻求帮助了。没有许可证,我无权访问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()应该可以解决问题,但是我只能找到对该方法的引用,但没有关于它的作用或工作方式的详细信息。有人可以告诉我我在这里想念的吗?