Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Itext7希伯来文反面版_Java_Itext7 - Fatal编程技术网

Java Itext7希伯来文反面版

Java Itext7希伯来文反面版,java,itext7,Java,Itext7,我有一段简单的代码,可以编写一个PDF,这个PDF将包含RTL语言,如希伯来语或阿拉伯语。 我能够使用Bidi(Ibm lib)操作文本并镜像它 但文本仍在反向运行 在英语中,它类似于: 而不是: The quick brown fox jumps over the lazy dog 它似乎是: the lazy dog jumps over brown fox The quick 完整代码: @Test public void generatePdf() {

我有一段简单的代码,可以编写一个PDF,这个PDF将包含RTL语言,如希伯来语或阿拉伯语。
我能够使用Bidi(Ibm lib)操作文本并镜像它
但文本仍在反向运行

在英语中,它类似于:

而不是:

The quick 
brown fox 
jumps over 
the lazy dog
它似乎是:

the lazy dog
jumps over 
brown fox 
The quick 
完整代码:

@Test
public void generatePdf()  {
    
      SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-hh.mm.ss");
        String dest = "c:\\temp\\" + formatter.format(Calendar.getInstance().getTime()) + ".pdf";
         String fontPath = "C:\\Windows\\Fonts\\ARIALUNI.TTF";
         FontProgramFactory.registerFont(fontPath, "arialUnicode");
        OutputStream pdfFile = null;
        Document doc = null;
    try {
        ByteArrayOutputStream output = new ByteArrayOutputStream();  
        PdfFont PdfFont  = PdfFontFactory.createRegisteredFont("arialUnicode", PdfEncodings.IDENTITY_H, true);      
        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(output));
        pdfDoc.setDefaultPageSize(PageSize.A4);
        pdfDoc.addFont(PdfFont);
        doc = new Document(pdfDoc);
        doc.setBaseDirection(BaseDirection.RIGHT_TO_LEFT);

        String txt = "בתשרי נתן הדקל פרי שחום נחמד בחשוון ירד יורה ועל גגי רקד בכסלו נרקיס הופיע בטבת ברד ובשבט חמה הפציעה ליום אחד.  1234 באדר עלה ניחוח מן הפרדסים בניסן הונפו בכוח כל החרמשים";
        Bidi bidi = new Bidi();
        bidi.setPara(txt, Bidi.RTL, null);
        String mirrTxt = bidi.writeReordered(Bidi.DO_MIRRORING);
        Paragraph paragraph1 = new  Paragraph(mirrTxt)
                .setFont(PdfFont)
                .setFontSize(9)
                .setTextAlignment(TextAlignment.CENTER)
                .setHeight(200)
                .setWidth(70);
        paragraph1.setBorder(new SolidBorder(3));
        doc.add(paragraph1);  
                    
        Paragraph paragraph2 = new  Paragraph(txt)
                .setFont(PdfFont)
                .setFontSize(9)
                .setTextAlignment(TextAlignment.CENTER)
                .setHeight(200)
                .setWidth(70);
        paragraph2.setBorder(new SolidBorder(3));
        doc.add(paragraph2);  
        
        doc.close();
        doc.flush();
        pdfFile = new FileOutputStream(dest); 
        pdfFile.write(output.toByteArray()); 
        
        ProcessBuilder b = new ProcessBuilder("cmd.exe","/C","explorer " + dest);
        b.start();
        
        
    } catch (Exception e) {
        e.printStackTrace();
    }finally {          
        try {pdfFile.close();} catch (IOException e) {e.printStackTrace();}
    }
}

检查页面内容上的属性
dir=“rtl”
css


参考资料:

我发现在没有任何其他第三方库的情况下使用iText7和IBM ICU4J的唯一解决方案是,首先渲染线,然后逐个镜像它们。这需要一个helper类
LineMirroring
,它并不是最优雅的解决方案,但会产生您期望的输出

行镜像类

public class LineMirroring {

private final PageSize pageSize;
private final String fontName;
private final int fontSize;

public LineMirroring(PageSize pageSize, String fontName, int fontSize) {
    this.pageSize = pageSize;
    this.fontName = fontName;
    this.fontSize = fontSize;
}

public String mirrorParagraph(String input, int height, int width, Border border) {
    final StringBuilder mirrored = new StringBuilder();
    try (ByteArrayOutputStream output = new ByteArrayOutputStream()) {
        PdfFont font = PdfFontFactory.createRegisteredFont(fontName, PdfEncodings.IDENTITY_H, true);
        final PdfWriter writer = new PdfWriter(output);
        final PdfDocument pdfDoc = new PdfDocument(writer);
        pdfDoc.setDefaultPageSize(pageSize);
        pdfDoc.addFont(font);
        final Document doc = new Document(pdfDoc);
        doc.setBaseDirection(BaseDirection.RIGHT_TO_LEFT);
        final LineTrackingParagraph paragraph = new LineTrackingParagraph(input);
        paragraph.setFont(font)
                .setFontSize(fontSize)
                .setTextAlignment(TextAlignment.RIGHT)
                .setHeight(height)
                .setWidth(width)
                .setBorder(border);
        LineTrackingParagraphRenderer renderer = new LineTrackingParagraphRenderer(paragraph);
        doc.add(paragraph);
        Bidi bidi;
        for (LineRenderer lr : paragraph.getWrittenLines()) {
            bidi = new Bidi(((TextRenderer) lr.getChildRenderers().get(0)).getText().toString(), Bidi.RTL);
            mirrored.append(bidi.writeReordered(Bidi.DO_MIRRORING));
        }
        doc.close();
        pdfDoc.close();
        writer.close();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
    return mirrored.toString();
}

private class LineTrackingParagraph extends Paragraph {

    private List<LineRenderer> lines;

    public LineTrackingParagraph(String text) {
        super(text);
    }

    public void addWrittenLines(List<LineRenderer> lines) {
        this.lines = lines;
    }

    public List<LineRenderer> getWrittenLines() {
        return lines;
    }

    @Override
    protected IRenderer makeNewRenderer() {
        return new LineTrackingParagraphRenderer(this);
    }
}

private class LineTrackingParagraphRenderer extends ParagraphRenderer {
    public LineTrackingParagraphRenderer(LineTrackingParagraph modelElement) {
        super(modelElement);
    }

    @Override
    public void drawChildren(DrawContext drawContext) {
        ((LineTrackingParagraph)modelElement).addWrittenLines(lines);
        super.drawChildren(drawContext);
    }

    @Override
    public IRenderer getNextRenderer() {
        return new LineTrackingParagraphRenderer((LineTrackingParagraph) modelElement);
    }
}
public class Itext7HebrewTest {

@Test
public void generatePdf() {

    final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd-hh.mm.ss");
    final String dest = "F:\\Temp\\" + formatter.format(Calendar.getInstance().getTime()) + ".pdf";
    final String fontPath = "C:\\Windows\\Fonts\\ARIALUNI.TTF";
    final String fontName = "arialUnicode";
    FontProgramFactory.registerFont(fontPath, "arialUnicode");

    try (ByteArrayOutputStream output = new ByteArrayOutputStream()) {
        PdfFont arial = PdfFontFactory.createRegisteredFont(fontName, PdfEncodings.IDENTITY_H, true);

        PdfDocument pdfDoc = new PdfDocument(new PdfWriter(output));
        pdfDoc.setDefaultPageSize(PageSize.A4);
        pdfDoc.addFont(arial);
        LineMirroring mirroring = new LineMirroring(pdfDoc.getDefaultPageSize(), fontName,9);

        Document doc = new Document(pdfDoc);
        doc.setBaseDirection(BaseDirection.RIGHT_TO_LEFT);

        final String txt = "בתשרי נתן הדקל פרי שחום נחמד בחשוון ירד יורה ועל גגי רקד בכסלו נרקיס הופיע בטבת ברד ובשבט חמה הפציעה ליום אחד.  1234 באדר עלה ניחוח מן הפרדסים בניסן הונפו בכוח כל החרמשים";

        final int height = 200;
        final int width = 70;
        final Border border = new SolidBorder(3);

        Paragraph paragraph1 = new Paragraph(mirroring.mirrorParagraph(txt, height, width, border));
        paragraph1.setFont(arial)
                .setFontSize(9)
                .setTextAlignment(TextAlignment.RIGHT)
                .setHeight(height)
                .setWidth(width)
                .setBorder(border);
        doc.add(paragraph1);

        doc.close();
        doc.flush();
        try (FileOutputStream pdfFile = new FileOutputStream(dest)) {
            pdfFile.write(output.toByteArray());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

谢谢@Gopesh这是HTML转换,我不是在做HTML转换,而是自己创建PDF,我使用的是iText7,不是iText5iText 7,它能够完成引擎盖下的所有操作。无需使用Bidi算法。只需使用pdfCalligraph加载项pdfCalligraph是一个付费加载项,它适用于一个软件,该软件将在几个月内生成一个pdf,因此我不确定该软件是否会获得批准…通常在希伯来语中,如果预期在查看器/编辑器中,单词将显示为dcba abcd,但如果我们将字符拆分为数组并进行检查,“a”将位于数组中的位置“0”。可能是您没有收到您的查询。对于您的查询,是整行显示为反向还是只有单词显示为反向?句子显示为反向请参见示例“the lazy dog”句子应该是最后一个,但它是第一个…谢谢您,它生成了错误的输出,请参见此处(您的输出在左侧)