gpt4 book ai didi

java - 用PDFBOX写阿拉伯字符

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:26 26 4
gpt4 key购买 nike

<分区>

  1. 更新 1

我正在尝试使用 pdfbox 在 pdf 文档中写入一些阿拉伯字符。结果我得到了一些奇怪的字符。您可以在下面找到我用于测试的代码片段。请注意,使用相同的代码打印拉丁字符没有任何问题。

public static void main(String[] args) throws Exception {

PDDocument document = new PDDocument();

PDPage page = new PDPage(PDPage.PAGE_SIZE_A4);
document.addPage(page);

PDPageContentStream stream = new PDPageContentStream(document, page,true, true);

//Use of a unicode font
PDFont font = PDTrueTypeFont.loadTTF(document,"C:/arialuni.ttf");

font.setFontEncoding(new WinAnsiEncoding());

stream.setFont(font, 12);
stream.beginText();

stream.moveTextPositionByAmount(40, 600);

stream.drawString("سي ججس ححسيب حسججسيبنم حح ");
stream.endText();
stream.close();
document.save("c:\\resultpdf.pdf");
document.close();

}

感谢您的帮助。我试了从微软网站下载的Unicode字体,结果还是一样。

  1. 更新 2

通过使用方法“drawUnicodeString”和方法“loadTTF”,我从 PDFBOX-922 中得到了我能够写阿拉伯字符,但它们是断开连接的,并且是从左到右排序的。这里有两个方法 'drawUnicodeString' 和 'loadTTF'

public void drawUnicodeString(String text) throws IOException {
COSString string = new COSString();
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
string.append(c >> 8);
string.append(c & 0xff);
}
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
string.writePDF(buffer);
appendRawCommands(buffer.toByteArray());
appendRawCommands(32);
appendRawCommands(getISOBytes("Tj\n"));
}


public static PDType0Font loadTTF(PDDocument doc, InputStream is)
throws IOException {
/* Load the font which we will convert to Type0 font. */
PDTrueTypeFont pdTtf = PDTrueTypeFont.loadTTF(doc, is);

TrueTypeFont ttf = pdTtf.getTTFFont();
CMAPEncodingEntry unicodeMap = null;
for (CMAPEncodingEntry candidate : ttf.getCMAP().getCmaps()) {
if (candidate.getPlatformId() == CMAPTable.PLATFORM_WINDOWS
&& candidate.getPlatformEncodingId() == CMAPTable.ENCODING_UNICODE) {
unicodeMap = candidate;
break;
}
}
if (unicodeMap == null) {
throw new RuntimeException(
"To use as CIDFont, the TTF must have a Windows platform Unicode encoding");
}
float scaling = 1000f / ttf.getHeader().getUnitsPerEm();

MyPDCIDFontType2Font pdCidFont2 = new MyPDCIDFontType2Font();
pdCidFont2.setBaseFont(pdTtf.getBaseFont());
pdCidFont2.setFontDescriptor((PDFontDescriptorDictionary) pdTtf
.getFontDescriptor());
/* Fixme -- should determine the minimum and maximum charcode in the map */
int[] cid2gid = new int[65536];
List<Float> widths = new ArrayList<Float>();
int[] widthValues = ttf.getHorizontalMetrics().getAdvanceWidth();
for (int i = 0; i < cid2gid.length; i++) {
int glyph = unicodeMap.getGlyphId(i);
cid2gid[i] = glyph;
widths.add((float) i);
widths.add((float) i);
widths.add(widthValues[glyph] * scaling);
}
pdCidFont2.setCidToGid(cid2gid);
pdCidFont2.setWidths(widths);
pdCidFont2.setDefaultWidth(widths.get(0).longValue());

/* Now construct the type0 font that we actually return */
myType0Font pdFont0 = new myType0Font();
pdFont0.setDescendantFont(pdCidFont2);
pdFont0.setDescendantFonts(new COSObject(pdCidFont2.getCOSObject()));
pdFont0.setEncoding(COSName.IDENTITY_H);

pdFont0.setBaseFont(pdTtf.getBaseFont());

// pdfont0.setToUnicode(COSName.IDENTITY_H); XXX how to express identity
// mapping as ToUnicode program? */
return pdFont0;
}

这里是打印的字符:

disconnected arabic letters

我不知道为什么这些字符断开连接

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com