- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个简单的 Java 程序,它使用 iTextPDF 创建一个简单的“Hello World”文件,使用的字体不是 iTextPDF 的原生字体(COOPBL.TTF,直接来自 Windows)。
在 Windows 7-64 上运行它运行良好并创建一个 pdf 文件,文件中嵌入了 Cooper Black 字体的子集,反射(reflect)在文件外观上。
在 Linux 上运行完全相同的类文件(无需重新编译),它不嵌入任何内容并使用 Helvetica。
程序如下:
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
public class iTextTest {
private void doit(String sOut) {
Document doc = new Document(PageSize.LETTER);
try {
FileOutputStream fOut = new FileOutputStream(sOut);
// Register a non-native font.
String sFontDir = ".";
int iResult = FontFactory.registerDirectory(sFontDir);
if(iResult == 0) {
System.out.println("TestPDF(): Could not register font directory " + sFontDir);
} else {
System.out.println("TestPDF(): Registered font directory " + sFontDir);
}
System.out.println(" Fonts registered:");
for(String sFont:FontFactory.getRegisteredFonts()) {
System.out.println(" " + sFont);
}
PdfWriter pdfWriter = PdfWriter.getInstance(doc, fOut);
doc.open();
XMLWorkerHelper helper = XMLWorkerHelper.getInstance();
String htmlContent;
htmlContent = "<HTML><HEAD></HEAD><BODY>";
htmlContent += "<P style=\"font-family: cooperblack;\">";
htmlContent += "Hello World!";
htmlContent += "</P>";
htmlContent += "</BODY></HTML>";
helper.parseXHtml(pdfWriter, doc, new ByteArrayInputStream(htmlContent.getBytes()));
} catch(IOException e) {
e.printStackTrace();
} catch(DocumentException e) {
e.printStackTrace();
}
if(doc != null) {
doc.close();
}
}
public static void main(String[] args) {
if(args.length != 1) {
System.out.println("Usage: iTextTest outfile");
return;
}
iTextTest test = new iTextTest();
test.doit(args[0]);
}
}
我正在使用: itextpdf-5.5.0 xmlworker-5.5.0 Windows Java 1.6.0_21 Linux Java 1.6.0_23
我会包括字体和生成的 pdf 的副本,但看不到这样做的明显方法。对于我的测试,我只是将\Windows\fonts\COOPBL.TTF 复制到测试目录中,用于 Windows 测试和 Linux 测试。
它的值(value):- 调整字体文件中的保护/属性标志没有任何区别。- 我知道这不是公共(public)领域的字体。我仅将其用于测试。
我会洗耳恭听!
谢谢,查克
最佳答案
在 Windows 和 Linux 上并排调试(Windows Ecplise 和控制台 jdb -ack!)后,我发现了问题所在。这似乎是文档缺陷,或者是我的疏忽。我想我会在此处发布修复程序,以防其他人遇到类似问题。
问题是,如果我要使用 XMLWorkerHelper 来解析文件,我就不应该使用默认的 FontFactory 来注册字体。我在第一个代码示例中使用的 XMLWorkerHelper.parseXHtml() 的风格创建了它自己的 FontFactoryImp,即 XMLWorkerFontProvider。该提供程序忽略由默认 FontFactory 执行的任何注册。
修复有两个方面:
1) 创建您自己的 XMLWorkerFontProvider。使用将字体目录作为输入参数的构造函数。
2) 将该提供者传递给 parseXHtml(),而不是使用较短的调用。
我还使用 FontFactory.setFontImp() 设置了默认的 FontFactory 提供者。我没有研究该操作的微妙含义,但跳过或不跳过该步骤很容易。
值得一提的是,原始程序在 Windows 中运行的唯一原因是在我对 parseXHtml() 的原始调用内部提供的默认 XMLWorkerFontProvider 在所有系统目录中注册了所有字体。因为,在 Windows 端,我使用的字体已经在 C:/Windows/fonts 中,这是被拾取的字体,而不是本地目录中的文件。如果我使用了未在 Windows 中注册的新字体,Windows 测试也会失败。
这是可行的解决方案。它在 Windows 和 Linux 上生成相同的 pdf 文件:
注意:如果您使用的是 XMLParser.parse() 而不是 XMLWorkerHelper.parseXHtml(),请查看此代码块之后的附加注释。
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.File;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
public class iTextTest {
private void doit(String sOut) {
Document doc = new Document(PageSize.LETTER);
try {
FileOutputStream fOut = new FileOutputStream(sOut);
// Register non-native fonts in a directory.
String sFontDir = ".";
XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(sFontDir, null);
FontFactory.setFontImp(fontImp);
System.out.println(" Fonts registered before parsing:");
for(String sFont:FontFactory.getRegisteredFonts()) {
System.out.println(" " + sFont);
}
PdfWriter pdfWriter = PdfWriter.getInstance(doc, fOut);
doc.open();
XMLWorkerHelper helper = XMLWorkerHelper.getInstance();
String htmlContent;
htmlContent = "<HTML><HEAD></HEAD><BODY>";
htmlContent += "<P style=\"font-family: cooperblack;\">";
htmlContent += "Hello World!";
htmlContent += "</P>";
htmlContent += "</BODY></HTML>";
helper.parseXHtml(pdfWriter,
doc,
new ByteArrayInputStream(htmlContent.getBytes()),
XMLWorkerHelper.class.getResourceAsStream("/default.css"),
null,
fontImp);
} catch(IOException e) {
e.printStackTrace();
} catch(DocumentException e) {
e.printStackTrace();
}
if(doc != null) {
doc.close();
}
}
public static void main(String[] args) {
if(args.length != 1) {
System.out.println("Usage: iTextTest outfile");
return;
}
iTextTest test = new iTextTest();
test.doit(args[0]);
}
}
在最新的更新中,我还必须调整使用 XMLParser 的代码。问题是相似的。默认的 HtmlPipelineContext 创建它自己的 XMLWorkerFontProvider。与上述情况一样,这将忽略您使用默认 FontFactory.registerDirectory() 注册的任何字体。同样,解决方案是使用您自己的 XMLWorkerFontProvider,然后将其提供给 HtmlPipelineContext。然后,您需要为自己的 XMLWorker 创建一个新的 CssResolverPipeline,然后将其传递给 XMLParser 构造函数。
下面是一小段代码(使用自定义图像处理程序):
htmlContext = new HtmlPipelineContext(new CssAppliersImpl(fontImp));
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
pdfImageProvider = new PDFImageProvider(); // Optional
htmlContext.setImageProvider(pdfImageProvider); // Optional
Pipeline<?> pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(doc, pdfWriter)));
xmlWorker = new XMLWorker(pipeline, true);
xmlParser = new XMLParser(true, xmlWorker, charsetUTF8);
我希望这可以节省我花了几天时间进行追踪的人!
关于linux - itextpdf 字体未嵌入 Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22976656/
我正在用 JAVA 创建一个简单的程序,其中有一个按钮,单击后即可创建 PDF。我正在使用 iText JAVA 库来生成 PDF。我已将 iText .jar 文件包含在“Java 构建路径”中,但
在最新版本的 itextpad v5.4.0 中找不到类“com.itextpdf.text.pdf.PdfAWriter”。我什至尝试下载额外的 jar,但无济于事。 我们将不胜感激。 最佳答案 我
我是 android 的新手,我正在尝试在 android 中将位图转换为 Pdf。我正在使用 itextpdf 5.5.4 jar 文件。我使用的代码如下: import com.itextpdf.
我使用以下代码的目的是将 HTML 文件转换为 PDF try { com.itextpdf.text.Document document = new com.itextpdf.text
我正在尝试将表格放在已在“PdfPageEventHelper”中横向旋转的 PDF 页面上: public void onStartPage(PdfWriter writer_,Document d
嘿哟,我的这段代码有问题: private void createPDF(String[] url, String name) throws FileNotFoundException, Docu
我在使用 itext 7 时遇到两个问题。其中一个是,如果您引入的链接长于一行,则第一行将显示为其自己的链接,只有第二行引用整个内容。第二个问题是关于在链接周围添加边框。该边框仅出现在链接的后半部分(
iTextPdf 是否允许设置表格中单元格之间的间距? 我有一个包含 2 列的表格,我正在尝试在单元格上绘制边框底部。我希望每个边框之间的空间与单元格填充相同。 我正在使用下面的代码: Pdf
我有一堆 PDF,此时我已将它们合并到代码中。在合并的 PDF 的开头,我有一个内容页面,分别链接到所述 PDF。这些 pdfAction.gotoLocalPage 链接有时无法正常工作,而是跳转到
以下是我使用 iText 从 Java 生成 PDF 的代码: import java.io.File; import java.io.FileOutputStream; import java.io
是否可以通过 iTextPDF 库从现有的 pdf 文件中提取页面并将整个页面另存为图像。 例如,如果我的 pdf 文件包含 2 个页面,那么将生成 2 个图像,每个图像将是特定页面的快照。 最佳答案
大家好! 我对文档有一些疑问: itextpdf 是否可以选择在特定页面上设置不同的边距?我试过用 document.setMargin 然后 document.newPage 但似乎每一页都有相同的
我在 Ubuntu 上使用 itextpdf 来填写带有数据的 PDF 表单。事实上,我使用了这个工具包中包含的一个类(实用程序):PdfFormFiller。数据由 Unicode 字符串表示。为了
我想动态对齐 iText PdfTable。 如何在 iTextPDF 中设置基于 x 和 y 位置的对齐方式。 PdfPCell cell; cell = new PdfPCell(testTabl
我正在使用 iTextPdf 为 pdf 构建表格。每页将有 9 到 15 列,确切数字直到运行时才知道。 iTextPDF 非常适合在整个页面宽度上创建大小相同的列。但我想不通的是如何创建不同宽度的
我使用 iTextPdf 从 html 页面生成 pdf 文件,例如: iTextSharp.text.html.simpleparser.HTMLWorker hw = new iTextSharp
本文整理了Java中com.itextpdf.text.ZapfDingbatsList类的一些代码示例,展示了ZapfDingbatsList类的具体用法。这些代码示例主要来源于Github/Sta
如何在 iTextpdf 中设置表格的行位置和宽度?这里我需要如何设置每个单元格的位置以及如何在 itextpdf 中设置行间距 testTable11_close_right.getDefaultC
我正在使用 itextpdf 将一些 pdf 合并为一个。 itextpdf pdfcontentbyte addtemplate的参数是什么意思,没有文档描述。 最佳答案 下面的代码成功了,感谢帮助
我有这个移动应用程序,我需要将数据库的一些行导出为 pdf。我需要有一个 pdf 结构才能正确放置信息。这是我的代码,但由于某种原因 PDF 是空白的。主要目标是在开头有一个标题,然后是数据库中的一行
我是一名优秀的程序员,十分优秀!