gpt4 book ai didi

c# - 如何用java或C#解析包含utf-8字符的pdf文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:19 27 4
gpt4 key购买 nike

我有一个 pdf 文件,其中包含 utf-8 字符(İ、ğ、ı 和阿拉伯字母等)。如何解析这个文件?
我使用 itext 和 pdfBox,但我看到“çekti¤i k夛da”而不是“çektiği kağıda”。我该如何解决这个问题?

最佳答案

由于尚未提供示例,我自己创建了阿拉伯语测试数据(好吧,实际上我从 itext-questions 邮件列表上的一些帖子中借用了用于创建测试数据的代码)和一个解析这些数据的测试:

package itext.parsing;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;

import junit.framework.TestCase;

public class TextExtractingArabic extends TestCase
{
public void testExtractArabicChars() throws DocumentException, IOException
{
createTestFile(TEST_FILE);

PdfReader reader = new PdfReader(TEST_FILE.toString());
String text = PdfTextExtractor.getTextFromPage(reader, 1);
for (char c: text.toCharArray())
{
int i = c<0 ? Integer.MAX_VALUE + c : c;
System.out.print("\\u");
System.out.print(Integer.toHexString(i));
}
}

void createTestFile(File file) throws DocumentException, IOException
{
Document document = new Document();
OutputStream os = new FileOutputStream(file);
PdfWriter.getInstance(document, os);
document.open();

BaseFont bfArialUni = BaseFont.createFont("C:\\Windows\\Fonts" + "\\ARIALUNI.TTF",
BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font fontArialUni = new Font(bfArialUni, 12f);
Phrase myPhrase = new Phrase(LAWRENCE_OF_ARABIA, fontArialUni);

PdfPTable table = new PdfPTable(1);
PdfPCell cell = new PdfPCell(new Paragraph(myPhrase));
cell.setColspan(3);
cell.setPaddingRight(15f);
cell.setBorder(PdfPCell.NO_BORDER);
cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
table.addCell(cell);

document.add(table);
document.close();
os.close();
}

final static File TEST_FILE = new File("arabic-test.pdf");
final static String LAWRENCE_OF_ARABIA =
"\u0644\u0648\u0631\u0627\u0646\u0633\u0627\u0644\u0639\u0631\u0628";
}

字符串 LAWRENCE_OF_ARABIA 在语音上有点接近阿拉伯的劳伦斯。

文本的输出是:

\ufe8f\ufeae\ufecc\ufedf\ufe8e\ufeb4\ufee7\ufe8d\ufead\ufeee\ufedf

虽然这与输入不同,但快速查看 unicode 表会发现输入来自 Unicode 范围“Arabic”,输出来自 Unicode 范围“Arabic Presentation Forms-B”。此外,输出是从左到右,而输入是从右到左。

我自己不懂阿拉伯语,因此不能说输出的准确性如何,但解析的字符肯定来自适当的 Unicode 范围。

据我所知,在没有访问原始海报所使用的 PDF 的情况下,问题似乎不在于解析,而是正确使用解析器的输出。

关于c# - 如何用java或C#解析包含utf-8字符的pdf文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12991270/

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