gpt4 book ai didi

java - 使用PDFBox后的编码问题

转载 作者:行者123 更新时间:2023-11-30 05:25:15 32 4
gpt4 key购买 nike

我必须

  1. 从pdf中提取文本,我大致使用这个

    f = IOUtility.getFileForPath(filePath);
    RandomAccessFile randomAccessFile = new RandomAccessFile(f, "r");
    PDFParser parser = new PDFParser(randomAccessFile);
    parser.parse();
    cosDoc = parser.getDocument();
    pdfStripper = new PDFTextStripper();
    pdDoc = new PDDocument(cosDoc);
    pdfStripper.setStartPage(1);
    pdfStripper.setEndPage(pdDoc.getNumberOfPages());
    String parsedText = pdfStripper.getText(pdDoc);
  2. 缩放 PDF

    File PDFFile = IOUtility.getFileForPath(scaleConfig.getFilePath());
    document = PDDocument.load(PDFFile);

    for (PDPage page : document.getPages()) {
    PDRectangle cropBox = page.getCropBox();
    float tx = ((cropBox.getLowerLeftX() + cropBox.getUpperRightX()) * 0.03f) / 2;
    float ty = ((cropBox.getLowerLeftY() + cropBox.getUpperRightY()) * 0.03f) / 2;
    PDPageContentStream cs = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.PREPEND, false, false);
    cs.transform(Matrix.getScaleInstance(0.97f, 0.97f));
    cs.transform(Matrix.getTranslateInstance(tx, ty));
    cs.close();
    }
    document.save(scaleConfig.getTargetFilePath());
  3. 最后在 pdf 的每一页上写一些东西。我使用此处提到的 14 种受支持字体之一 https://pdfbox.apache.org/1.8/cookbook/workingwithfonts.html 。在本例中为 Times New Roman。

    File PDFFile = IOUtility.getFileForPath(writeConfig.getFilePath());
    document = PDDocument.load(PDFFile);
    for (PDPage page : document.getPages()) {
    PDFBoxHelper.fixRotation(document, page);
    writeStringOnPage(document, page, writeConfig);
    }
    document.save(writeConfig.getTargetFilePath());

    writeStringOnPage一起做

    contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, false, true);
    WriteCoordinates writeCoordinates = WriteCoordinateFactory.buildCoordinates(writeConfig, page.getMediaBox());
    contentStream.beginText();
    // lower left x and lower left y are different after rotation so use those for your calculation
    contentStream.newLineAtOffset(writeCoordinates.getX(), writeCoordinates.getY());
    contentStream.setFont(writeConfig.getFont(), writeConfig.getFontSize());
    contentStream.setNonStrokingColor(writeConfig.getFontColor());
    contentStream.showText(writeConfig.getToWrite());
    contentStream.endText();

由于公司原因,我省略了签名和 catch block 。我总是关闭内容流。

大多数情况下,处理后的 PDF 在 Chrome PDF-Viewer、Acrobat Reader 中以及将其导入 BMD 后看起来都很好。但在某些特定情况下,我似乎存在编码问题,并且某些部分无法正确显示。我在 PDF 中添加的所有文本始终正确显示。

我意识到 PDF 中只有粗体打印的文本才会显示错误,因此我使用 Adob​​e Acrobat Reader 查看所使用的字体。

eingebettete Schriften

Arial 和 Arial,Bold 已嵌入并使用 Identity-H 进行编码。由于一切都是粗体写的,我得出的结论是,所有用 Arial、粗体写的文本都显示错误。处理完pdf后,其他一切都很好。我无法添加 pdf,因为它包含客户数据,但这里有一些示例:

  1. 研究编号:--> 5HFKQXQJV1U
  2. 60 塔格内托 (27.12.2019) -> 7DJHQHWWR

如果在没有 PDFBox 操作的情况下将 PDF 导入到 BMD 中,则它会正确显示。

我试图通过仅缩放和仅写入来缩小问题范围,但问题两次都发生了。

我正在使用 PDFBox 2.017 和 Java 8。

由于当我仅缩放 pdf 时也会发生错误,因此我使用 PDFDebugger 来比较原始 PDF:

orignal PDF

以及缩放后的 pdf:

scaled PDF

唯一看起来不同/不同的是内容条目。

当我打开缩放后的 PDF 并单击“字体”部分和 Arial、粗体字体时,我收到很多有关 unicode 映射的警告。不过,PDF 在 PDFDebugger 中正确显示。

warnings

我既不是 PDFBox 方面的专家,也不是字体和编码方面的专家,因此我们将不胜感激!

最佳答案

简而言之

相关区别在于 PDFBox 以不同方式序列化名称。但是根据 PDF 规范的不同输出是等效的,因此您显然已经发现了 WPViewPDF 错误。

名字写法的区别

在原始 PDF (raw.pdf) 中,您可以在 PDFBox 操作的所有文件中找到名称 NOWFJV+Arial,BoldNOWFJV+Arial,Bold-WinCharSetFFFF您会发现内容流之外所有出现的这些名称都被 NOWFJV+Arial#2CBoldNOWFJV+Arial#2CBold-WinCharSetFFFF 替换。

WPViewPDF 无法正确显示使用这些更改名称的字体编写的文本。将 PDF 修补回包含逗号来代替这些名称中的“#2C”后,WPViewPDF 再次正确显示此类文本。

我假设 WPViewPDF 在内容流中找到 NOWFJV+Arial,Bold ,并期望使用相同的书写名称在页面资源中找到匹配的字体定义,因此它无法识别它名称NOWFJV+Arial#2CBold

这是 PDFBox 错误吗?

根据PDF规范,

Any character in a name that is a regular character (other than NUMBER SIGN) shall be written as itself or by using its 2-digit hexadecimal code, preceded by the NUMBER SIGN.

(ISO 32000-2,第 7.3.5 节“命名对象”)

因此,用“#2C”序列替换名称中的逗号是编写这些名称的完全有效的替代方法。

因此,不,这不是 PDFBox 错误,而显然是 WPViewPDF 错误。

关于java - 使用PDFBox后的编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58808800/

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