Пожалуйста, посмотрите примеры ParseHtml7 и ParseHtml8 . Они берут HTML-код с арабскими символами, и они создают PDF-файл с тем же арабским текстом:
[/g7] [/g8]
Прежде чем мы посмотрим на код, позвольте мне объяснить, что не рекомендуется использовать символы, отличные от ASCII, в исходном коде. Например: это не сделано:
htmlContentAr = “ رقم التعميم رقم التعميم
رقم التعميم ….
”;
Вы никогда не знаете, как будет храниться файл Java, содержащий эти глифы. Если он не сохранен как UTF-8, символы могут выглядеть как нечто совершенно другое. Известно, что системы управления версиями имеют проблемы с символами, отличными от ASCII, и даже компиляторы могут неправильно кодировать кодировку. Если вы действительно хотите сохранить жестко закодированные значения String
в своем коде, используйте нотацию UNICODE. Часть проблемы связана с проблемой кодирования, и вы можете узнать об этом подробнее: Невозможно получить чешских символов при создании PDF
Для примеров, показанных на снимках экрана , Я сохранил следующие файлы, используя кодировку UTF-8:
Это то, что вы найдете в файле arabic.html
:
رقم التعميم رقم التعميم
رقم التعميم
Это то, что вы найдете в файле arabic2.html
:
رقم التعميم رقم التعميم
رقم التعميم
Вторая часть вашей проблемы касается шрифта. Важно, чтобы вы использовали шрифт, который знает, как рисовать арабские глифы. Трудно поверить, что у вас есть arial.ttf
прямо в корне вашего диска C:
. Это не очень хорошая идея. Я ожидаю, что вы будете использовать C:/windows/fonts/arialuni.ttf
, который, безусловно, знает арабские глифы.
Выбор шрифта недостаточен. Ваш HTML должен знать, какое семейство шрифтов использовать. Поскольку большинство примеров в документации используют Arial, я решил использовать шрифт NOTO. Я открыл эти шрифты, прочитав этот вопрос: iText pdf, не отображающий китайских символов при использовании шрифтов NOTO или Source Hans . Мне очень нравятся эти шрифты, потому что они приятные и (почти) каждый язык поддерживается. Например, я использовал NotoNaskhArabic-Regular.ttf
, что означает, что мне нужно определить шрифт familie следующим образом:
style="font-family: Noto Naskh Arabic"
Я определил стиль в теге body моего XML, очевидно, что вы можете выбрать, где чтобы определить его: во внешнем файле CSS в разделе стилей Конечно: когда XML Worker встречает Есть еще одно препятствие: арабский текст написан справа налево. Я вижу, что вы хотите определить направление прогона на уровне В HTML нет таблицы, но мы создаем собственный Возможно, это ваше фактическое требование, но зачем вы это делаете в таком свернутый путь? Если вам нужна таблица, почему бы вам не создать эту таблицу в HTML и определить, что некоторые ячейки RTL такие: Таким образом, вам не нужно создавать В этом примере требуется меньше кода, и если вы хотите изменить макет , достаточно изменить HTML. Вам не нужно менять код Java. Еще один пример: в ParseHtml9 я создаю таблицу с английским именем в одном столбце («Lawrence of Arabia») и арабский перевод в другом столбце («لورانس العرب»). Поскольку мне нужны разные шрифты для английского и арабского языков, я определяю шрифт на уровне Для первого столбца используется шрифт по умолчанию, и для записи не требуется специальных настроек слева направо. Для второго столбца я определяю арабский шрифт, и я задал направление прогона Результат выглядит следующим образом: [/g9] Это намного проще, чем то, что вы пытаетесь сделать в своем коде. Вы можете использовать К вашему сведению: Где Чистый Javascript, без jQuery , на уровне тега
, ... Этот выбор полностью принадлежит вам, но вы должны определить, какой шрифт использовать. font-family: Noto Naskh Arabic
, iText не знает, где найти соответствующий NotoNaskhArabic-Regular.ttf
, если мы не зарегистрируем этот шрифт. Мы можем сделать это, создав экземпляр интерфейса FontProvider
. Я решил использовать XMLWorkerFontProvider
, но вы можете написать свою собственную реализацию FontProvider
: XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("resources/fonts/NotoNaskhArabic-Regular.ttf");
PdfPCell
и добавить контент HTML в эту ячейку с помощью ElementList
. Вот почему я впервые написал аналогичный пример, названный 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();
}
PdfPTable
, добавляем контент от HTML до PdfPCell
с направлением направления LTR, и мы добавим эту ячейку в таблицу, а таблицу в документ. ...
ElementList
, вы можете просто проанализировать 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();
}
:
Lawrence of Arabia
لورانس العرب
"rtl"
. 2 ответа
Document#querySelector
, чтобы получить на основе селектора CSS. Для получения значения атрибута используйте метод Element#getAttribute
. И, наконец, вы можете обновить свойство, просто используя обозначение точки или скобки . document.querySelector('#' + e.target.getAttribute('for')).checked = true;
e
относится к объекту события. document.querySelector('#' + e.target + '[for]').checked = true;
Похожие вопросы: