Как написать .prop в javascript или угловом?

Пожалуйста, посмотрите примеры ParseHtml7 и ParseHtml8 . Они берут HTML-код с арабскими символами, и они создают PDF-файл с тем же арабским текстом:

A PDF table with HTML content [/g7] An HTML table in PDF [/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 встречает 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();
}

В HTML нет таблицы, но мы создаем собственный PdfPTable, добавляем контент от HTML до PdfPCell с направлением направления LTR, и мы добавим эту ячейку в таблицу, а таблицу в документ.

Возможно, это ваше фактическое требование, но зачем вы это делаете в таком свернутый путь? Если вам нужна таблица, почему бы вам не создать эту таблицу в HTML и определить, что некоторые ячейки RTL такие:

...

Таким образом, вам не нужно создавать 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();
}

В этом примере требуется меньше кода, и если вы хотите изменить макет , достаточно изменить HTML. Вам не нужно менять код Java.

Еще один пример: в ParseHtml9 я создаю таблицу с английским именем в одном столбце («Lawrence of Arabia») и арабский перевод в другом столбце («لورانس العرب»). Поскольку мне нужны разные шрифты для английского и арабского языков, я определяю шрифт на уровне :

Lawrence of Arabia لورانس العرب

Для первого столбца используется шрифт по умолчанию, и для записи не требуется специальных настроек слева направо. Для второго столбца я определяю арабский шрифт, и я задал направление прогона "rtl".

Результат выглядит следующим образом:

English next to Arabic [/g9]

Это намного проще, чем то, что вы пытаетесь сделать в своем коде.

-3
задан Piotr Kowalczyk 25 March 2019 в 17:23
поделиться

2 ответа

Вы можете использовать Document#querySelector , чтобы получить на основе селектора CSS. Для получения значения атрибута используйте метод Element#getAttribute . И, наконец, вы можете обновить свойство, просто используя обозначение точки или скобки .

document.querySelector('#' + e.target.getAttribute('for')).checked = true;

К вашему сведению: Где e относится к объекту события.

0
ответ дан Pranav C Balan 25 March 2019 в 17:23
поделиться

Чистый Javascript, без jQuery

document.querySelector('#' + e.target + '[for]').checked = true;
0
ответ дан marc_s 25 March 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: