- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在PDF生成中,我很难将HTML内容中的阿拉伯字符显示为“?”
我可以从字符串变量中显示阿拉伯文本。同时,我无法从HTML字符串生成阿拉伯文本。
我想用两列显示PDF,左边是英文,右边是阿拉伯文。
当我使用下面的程序转换成pdf时。请在这方面帮助我。
try
{
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
ByteArrayOutputStream out = new ByteArrayOutputStream();
PdfWriter writer = PdfWriter.getInstance(document, out);
BaseFont bf = BaseFont.createFont("C:\\arial.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font font = new Font(bf, 8);
document.open();
BufferedReader br = new BufferedReader(new FileReader("C:\\style.css"));
StringBuffer fileContents = new StringBuffer();
String line = br.readLine();
while (line != null)
{
fileContents.append(line);
line = br.readLine();
}
br.close();
String styles = fileContents.toString(); //"p { font-family: Arial;}";
Paragraph cirNoEn = null;
Paragraph cirNoAr = null;
String htmlContentEn = null;
String htmlContentAr = null;
PdfPCell contentEnCell = new PdfPCell();
PdfPCell contentArCell = new PdfPCell();
cirNoEn = new Paragraph("Circular No. (" + cirEnNo + ")", new Font(bf, 14, Font.BOLD | Font.UNDERLINE));
cirNoAr = new Paragraph("رقم التعميم (" + cirArNo + ")", new Font(bf, 14, Font.BOLD | Font.UNDERLINE));
htmlContentEn = “< p >< span > Dear….</ span ></ p >”;
htmlContentAr = “< p >< span > رقم التعميم رقم التعميم </ p >< p > رقم التعميم ….</ span ></ p >”;
for (Element e : XMLWorkerHelper.parseToElementList(htmlContentEn, styles))
{
for (Chunk c : e.getChunks())
{
c.setFont(new Font(bf));
}
contentEnCell.addElement(e);
}
for (Element e : XMLWorkerHelper.parseToElementList(htmlContentAr, styles))
{
for (Chunk c:e.getChunks())
{
c.setFont(new Font(bf));
}
contentArCell.addElement(e);
}
PdfPCell emptyCell = new PdfPCell();
PdfPCell cirNoEnCell = new PdfPCell(cirNoEn);
PdfPCell cirNoArCell = new PdfPCell(cirNoAr);
cirNoEnCell.setHorizontalAlignment(Element.ALIGN_CENTER);
cirNoArCell.setHorizontalAlignment(Element.ALIGN_CENTER);
emptyCell.setBorder(Rectangle.NO_BORDER);
emptyCell.setFixedHeight(15);
cirNoEnCell.setBorder(Rectangle.NO_BORDER);
cirNoArCell.setBorder(Rectangle.NO_BORDER);
contentEnCell.setBorder(Rectangle.NO_BORDER);
contentArCell.setBorder(Rectangle.NO_BORDER);
cirNoArCell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
contentArCell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
contentEnCell.setNoWrap(false);
contentArCell.setNoWrap(false);
PdfPTable circularInfoTable = null;
emptyCell.setColspan(2);
circularInfoTable = new PdfPTable(2);
circularInfoTable.addCell(cirNoEnCell);
circularInfoTable.addCell(cirNoArCell);
circularInfoTable.addCell(emptyCell);
circularInfoTable.addCell(emptyCell);
circularInfoTable.addCell(emptyCell);
circularInfoTable.addCell(contentEnCell);
circularInfoTable.addCell(contentArCell);
circularInfoTable.addCell(emptyCell);
circularInfoTable.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
circularInfoTable.setWidthPercentage(100);
document.add(circularInfoTable);
document.close();
}
catch (Exception e)
{
}
最佳答案
请看一下ParseHtml7和ParseHtml8示例。他们接受带有阿拉伯字符的HTML输入,并使用相同的阿拉伯文本创建PDF:
在我们看代码之前,请允许我解释一下,在源代码中使用非ASCII字符不是一个好主意。例如:未完成:
htmlContentAr = “<p><span> رقم التعميم رقم التعميم</p><p>رقم التعميم ….</span></p>”;
String
值,请使用UNICODE表示法。部分问题是编码问题,您可以在此处阅读更多有关此问题的信息:
Can't get Czech characters while generating a PDF
<html>
<body style="font-family: Noto Naskh Arabic">
<p>رقم التعميم رقم التعميم</p>
<p>رقم التعميم</p>
</body>
</html>
<html>
<body style="font-family: Noto Naskh Arabic">
<table>
<tr>
<td dir="rtl">رقم التعميم رقم التعميم</td>
<td dir="rtl">رقم التعميم</td>
</tr>
</table>
</body>
</html>
arabic.html
就在
arabic2.html
驱动器的根目录下。那不是个好主意。我希望您使用
arial.ttf
这个词当然知道阿拉伯符号。
C:
这意味着我需要定义这样的字体系列:
style="font-family: Noto Naskh Arabic"
C:/windows/fonts/arialuni.ttf
的style s部分,在
NotoNaskhArabic-Regular.ttf
标记的级别,。。。这完全是你的选择,但你必须确定在什么地方使用哪种字体。
<head>
时,iText不知道在哪里可以找到对应的
<td>
,除非我们注册了该字体。我们可以通过创建
font-family: Noto Naskh Arabic
接口的实例来实现这一点。我选择使用
NotoNaskhArabic-Regular.ttf
,但您可以自由编写自己的
FontProvider
实现:
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("resources/fonts/NotoNaskhArabic-Regular.ttf");
XMLWorkerFontProvider
级别定义运行方向,并使用
FontProvider
将HTML内容添加到此单元格。这就是为什么我第一次写了一个类似的例子,名为
ParseHtml7:
public void createPdf(String file) throws IOException, DocumentException {
// step 1
Document document = new Document();
// step 2
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
// step 3
document.open();
// step 4
// Styles
CSSResolver cssResolver = new StyleAttrCSSResolver();
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("resources/fonts/NotoNaskhArabic-Regular.ttf");
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
// HTML
HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
// Pipelines
ElementList elements = new ElementList();
ElementHandlerPipeline pdf = new ElementHandlerPipeline(elements, null);
HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
// XML Worker
XMLWorker worker = new XMLWorker(css, true);
XMLParser p = new XMLParser(worker);
p.parse(new FileInputStream(HTML), Charset.forName("UTF-8"));
PdfPTable table = new PdfPTable(1);
PdfPCell cell = new PdfPCell();
cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
for (Element e : elements) {
cell.addElement(e);
}
table.addCell(cell);
document.add(table);
// step 5
document.close();
}
PdfPCell
,使用run direction LTR将HTML中的内容添加到
ElementList
,并将此单元格添加到表中,将表添加到文档中。
<td dir="rtl">...</td>
PdfPTable
,只需将HTML解析为PDF,就像
ParseHtml8示例中所做的那样:
public void createPdf(String file) throws IOException, DocumentException {
// step 1
Document document = new Document();
// step 2
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));
// step 3
document.open();
// step 4
// Styles
CSSResolver cssResolver = new StyleAttrCSSResolver();
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("resources/fonts/NotoNaskhArabic-Regular.ttf");
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
// Pipelines
PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
// XML Worker
XMLWorker worker = new XMLWorker(css, true);
XMLParser p = new XMLParser(worker);
p.parse(new FileInputStream(HTML), Charset.forName("UTF-8"));;
// step 5
document.close();
}
PdfPCell
级别定义字体:
<table>
<tr>
<td>Lawrence of Arabia</td>
<td dir="rtl" style="font-family: Noto Naskh Arabic">لورانس العرب</td>
</tr>
</table>
ElementList
。
关于html - 使用iText从html内容到pdf的阿拉伯字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30214147/
iText 文档指出它只包含特定的字体子集,但从未说明它们是什么。有没有人知道 iText 中默认包含哪些字体? (我在网上搜索过,在任何地方都找不到这个字体列表!) 最佳答案 它可能指的是PDF S
我使用固定列宽创建了下表,如下所示, Table headerTable = new Table(new float[]{5,5,5}); headerTable.setWidthPercent(
我正在尝试使用 iText 缩放图像(在新的 PDF 文档上)以使其填充页面宽度而不拉伸(stretch),这样它可能需要几页。 我找到了很多解决方案,但它们都非常复杂,而且我真的不喜欢那样编码。到目
我正在使用 Flying Saucer/iText 生成报告。现在报告有一个条件,如果特定条件发生,报告应该移动到 pdf 的下一页,并在 PDF 上添加数据等等。 问候帕万 最佳答案 您必须使用 c
我正在使用 Flying Saucer/iText 生成报告。现在报告有一个条件,如果特定条件发生,报告应该移动到 pdf 的下一页,并在 PDF 上添加数据等等。 问候帕万 最佳答案 您必须使用 c
如何使用 iText 找到文档中的行的位置? 假设我有一个 PDF 文档中的表格,并且想要阅读其中的内容;我想找到细胞的确切位置。为了做到这一点,我想我可能会找到线条的交点。 最佳答案 我认为您使用
请找到下面的代码。 public class MakingFieldReadOnly implements PdfPCellEvent { /** The resulting PDF. */
在 iText 5 中有一个名为 getVerticalPosition() 的方法,它给出了下一个写入对象在页面上的位置。作为回答这个问题 How to find out the current c
抱歉,如果有类似我的帖子,但我是这个论坛的新手,我还没有找到它。 我有动态调整 TextField 大小取决于文本大小的问题。我填写现有的 PDF - 在 AcroForm 中填写字段: form.s
我正在使用 itext 生成 pdf。因此,当页面内容超出时,它会自动创建一个新页面。我想知道它是否创建了一个新页面。如果是,我想在页面顶部添加一些图像。 List paylist =new List
我的 有问题固定 表格左侧和右侧的边距。 我想删除该边距并使用没有边距或填充的所有工作表。我该怎么办? 我刚刚试过这个,但对我不起作用: cell.setPaddingLeft(0); cell.se
我有 2 行,我想对齐(证明)它们。 我有这个代码: Paragraph p=new Paragraph(ANC,fontFootData); p.setLeading(1, 1);
我有这样的场景。 我有一个生成 PDF 的应用程序,需要对其进行签名。 我们没有用于签署文档的证书,因为它们位于 HSM 中,而我们使用证书的唯一方法是使用 Web 服务。 此网络服务提供两个选项,发
我需要实现一个看起来像图片中的表格,列之间有空间。我试过: cell.setPaddingLeft(10); cell.setMarginLeft(10); extractio
我需要实现一个看起来像图片中的表格,列之间有空间。我试过: cell.setPaddingLeft(10); cell.setMarginLeft(10); extractio
我需要使用 Java 的 iText 库创建一个 PDF 文档。我还需要包括一些复选框,这些复选框根据某些类变量的值打开/关闭。我找到了一些关于交互式表单的示例,但我不需要这种复杂程度:只需将一些复选
我正在开发一个系统,我必须在其中将一些图像添加到现有的 PDF 文档中。 这适用于 iText 5.1.3,但由于某种原因,在包含扫描图像的 PDF 中,它不会添加任何图像。 这是 PDF Docum
我们正在研究信息提取,我们想使用iText。 我们正在探索 iText。根据我们查阅过的文献,iText 是最好的工具。是否可以从 iText 中每行的 pdf 中提取文本?我在与我的相关的 stac
我已经创建了一个带有一些文本字段的 pdf 文档。我可以使用 Adobe 阅读器填充这些文本字段并将这些值保存在该文件中。 我的问题是,我可以使用 iText 以编程方式执行此操作吗?如果可能,请
我正在使用 iText 5 表创建标签(如 Avery 标签)。标签元素的定位需要一些非常严格的公差,以便适合标签上的所有内容。我的问题是标签上有多个区域为 PdfPCells。我需要将文本放入这些区
我是一名优秀的程序员,十分优秀!