0

I used xmlworker-5.5.9.jar and itextpdf-5.5.13.jar,

In my web application I use CKEditor. At submit button i want to convert the CK content in .pdf format,

I used this code and it is working properly:

public  void createPDF(String text) throws DocumentException, IOException 
    {
        String fileName="f:\\test.pdf";
        Document document=new Document();
        PdfWriter pdfWriter=PdfWriter.getInstance(document, new FileOutputStream(fileName));
        document.open();
        String finall=text;
        InputStream is = new ByteArrayInputStream(finall.getBytes());
        XMLWorkerHelper.getInstance().parseXHtml(pdfWriter,document, is);
        document.close();

    }

but this code does not work with arabic text

I try with this solution without sucsess :

    public  void createPdf(String htmlContentAr)
    {
        Charset CHARSET_UTF8 = Charset.forName("UTF-8");


            try {

                Document pdfDoc = new Document();           
                PdfWriter writer = PdfWriter.getInstance(pdfDoc, new FileOutputStream("f:\\test.pdf"));
                writer.setRgbTransparencyBlending(true);
                pdfDoc.open();

                StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver();
                ElementsCollector elementsHandler = new ElementsCollector();
                HtmlPipelineContext htmlContext = new HtmlPipelineContext(new CssAppliersImpl(
                        new UnicodeFontProvider()));
                htmlContext.charSet(CHARSET_UTF8);
                htmlContext.setAcceptUnknown(true).autoBookmark(true)
                        .setTagFactory(Tags.getHtmlTagProcessorFactory());
                CssResolverPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext,
                        new ElementHandlerPipeline(elementsHandler, null)));

                XMLWorker worker = new XMLWorker(pipeline, true);
                XMLParser parser = new XMLParser();
                parser.addListener(worker);
                parser.parse(new StringReader(htmlContentAr));

                PdfPTable mainTable = new PdfPTable(1);
                mainTable.setWidthPercentage(100);
                PdfPCell cell = new PdfPCell();
                cell.setBorder(0);
                cell.setHorizontalAlignment(Element.ALIGN_LEFT);
                cell.addElement(elementsHandler.getParagraph());
                mainTable.addCell(cell);

                pdfDoc.add(mainTable);
                pdfDoc.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

and this is the code of ElementsCollector.java :

import java.util.Iterator;
import java.util.List;

import com.itextpdf.text.Chunk;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPRow;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.ElementHandler;
import com.itextpdf.tool.xml.Writable;
import com.itextpdf.tool.xml.html.pdfelement.NoNewLineParagraph;
import com.itextpdf.tool.xml.pipeline.WritableElement;

public class ElementsCollector implements ElementHandler {

private Paragraph _paragraph;

public ElementsCollector() {
    _paragraph = new Paragraph();
    _paragraph.setAlignment(Element.ALIGN_LEFT);
}

public Paragraph getParagraph() {
    return _paragraph;
}

@Override
public void add(Writable htmlElement) {
    WritableElement writableElement = (WritableElement) htmlElement;
    if (writableElement == null) {
        return;
    }
    for (Element element : writableElement.elements()) {
        if (element instanceof NoNewLineParagraph) {
            NoNewLineParagraph para = (NoNewLineParagraph) element;
            Iterator<Element> it = para.iterator();
            while (it.hasNext()) {
                Element divChildElement = (Element) it.next();
                fixNestedTablesRunDirection(divChildElement);
                _paragraph.add(divChildElement);
            }
        } else {
            fixNestedTablesRunDirection(element);
            _paragraph.add(element);
        }
    }
}

private void fixNestedTablesRunDirection(Element element) {
    if (element == null) {
        return;
    }
    if (element instanceof PdfPTable) {
        PdfPTable table = (PdfPTable) element;
        for (PdfPRow row : table.getRows()) {
            for (PdfPCell cell : row.getCells()) {
                if (cell.getCompositeElements() != null) {
                    for (Element item : cell.getCompositeElements()) {
                        List<Chunk> chunks = item.getChunks();
                        if (chunks != null) {
                            for (Chunk chunk : chunks) {
                                Font font = chunk.getFont();
                                if (font != null) {
                                    String name = font.getFamilyname() != null ? font.getFamilyname()
                                            .toLowerCase() : null;
                                    if (name != null && !name.isEmpty() && name.contains("arabic")) {
                                        cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
                                        if (item instanceof Paragraph
                                                && ((Paragraph) item).getAlignment() == 2) {
                                            ((Paragraph) item).setAlignment(0);
                                        }
                                        continue;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
}

and this is the code of UnicodeFontProvider.java

import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.FontFactoryImp;
import com.itextpdf.text.pdf.BaseFont;


public class UnicodeFontProvider extends FontFactoryImp {

public UnicodeFontProvider() {
    String root = System.getenv("SystemRoot");
    FileSystems.getDefault();
    Path path = Paths.get(root, "fonts");
    FontFactory.getFontImp().registerDirectory(path.toString());
    // TODO test, works on windows so far
}

public Font getFont(String fontname, String encoding, boolean embedded, float size, int style,
        BaseColor color, boolean cached) {
    if (fontname!= null && !fontname.isEmpty()) {
        return new Font(Font.FontFamily.UNDEFINED, size, style, color);
    }
    return FontFactory.getFont(fontname, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, size, style, color);
}
}

but nothing has been displayed in pdf file

I think the problem in this line :

parser.parse(new StringReader(htmlContentAr));

updated :

I try with this code :

import java.io.File;
import java.io.IOException;


import com.itextpdf.text.FontProvider;
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.FontProgram;
import com.itextpdf.io.font.FontProgramFactory;

import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;


public class TestHTML {
    public static final String[] FONTS = {
        "src/main/resources/fonts/noto/NotoSans-Regular.ttf",
        "src/main/resources/fonts/noto/NotoNaskhArabic-Regular.ttf",
        "src/main/resources/fonts/noto/NotoSansHebrew-Regular.ttf"
    };
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }



    public void createPdf(String src, String[] fonts, String dest) throws IOException {
        ConverterProperties properties = new ConverterProperties();
        FontProvider fontProvider = (FontProvider) new DefaultFontProvider(false, false, false);
        for (String font : fonts) {
            FontProgram fontProgram = FontProgramFactory.createFont(font);
             fontProvider.addFont(fontProgram);
        }
        properties.setFontProvider(fontProvider);
        HtmlConverter.convertToPdf(new File(src), new File(dest), properties);
    }




}

but I have errors which are related to jar :

error in this line :

fontProvider.addFont(fontProgram);

The method addFont(FontProgram) is undefined for the type FontProvider and error in :

properties.setFontProvider(fontProvider);

The method addFont(FontProgram) is undefined for the type FontProvider

also error in :

Multiple markers at this line - The type com.itextpdf.layout.font.FontProvider cannot be resolved. It is indirectly referenced from required .class files - The type com.itextpdf.layout.font.FontProvider cannot be resolved. It is indirectly referenced from required .class files

I used this jar :

kernel-7.0.0.jar ,io-7.0.0.jar ,html2pdf-1.0.2.jar ,itextpdf-5.5.13.jar,xmlworker-5.5.9.jar

franco
  • 1,829
  • 6
  • 42
  • 75
  • 1
    Your versions of XMLWorker and iText are not compatible. – Amedee Van Gasse Jul 03 '18 at 18:35
  • 1
    I recommend that you use iText 7.1.2 + the pdfHTML add-on. – Amedee Van Gasse Jul 03 '18 at 18:36
  • 1
    To be able to properly work with non-western languages like Arabic, I recommend the pdfCalligraph add-on, which is a closed source add-on for iText 7. – Amedee Van Gasse Jul 03 '18 at 18:38
  • I'm tempted to vote to close this question as a duplicate of [Converting HTML to PDF using iText](https://stackoverflow.com/questions/47895935/converting-html-to-pdf-using-itext), but that question doesn't explain that pdfCalligraph is needed for the Arabic as described in the [FAQ entry "How to convert HTML containing Arabic/Hebrew characters to PDF?"](https://developers.itextpdf.com/content/itext-7-converting-html-pdf-pdfhtml/chapter-7-frequently-asked-questions-about-pdfhtml/how-convert-html-containing-arabichebrew-characters-pdf) – Bruno Lowagie Jul 04 '18 at 07:55
  • thank you for your answer, I have updated my question. but I have errors which are related in use of incorrect jar : – franco Jul 04 '18 at 08:42

0 Answers0