当前位置: 首页 > 知识库问答 >
问题:

iText:从现有PDF中导入样式文本和信息

常波
2023-03-14
PdfReader reader = new PdfReader(pdf);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
TextExtractionStrategy strategy;
for(int i=1;i<=reader.getNumberOfPages();i++){
strategy = parser.processContent(i, new LocationTextExtractionStrategy());
document.add(new Chunk(strategy.getResultantText()));
}
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(RESULT));
PdfReader reader = new PdfReader(pdf);
PdfImportedPage page;
for(int i=1;i<=reader.getNumberOfPages();i++){
page = writer.getImportedPage(reader,i);
document.add(Image.getInstance(page));
}

这是我找到的两种方法。但由于它们都不适合我的目的,我的问题是:有没有一种方法可以导入所有东西,除了结尾的空行,但包括文本样式的信息,表格和其他所有东西,从PDF到我的文档使用iText?

共有1个答案

卢光誉
2023-03-14

您可以裁剪掉XSLT生成的PDF的空空间,然后像在代码中一样导入裁剪后的页面。

下面的代码借用了我的答案中使用iTextPDF修剪页面空格的代码。但是,与这里的代码不同的是,我们必须操作媒体框,而不是裁剪框,因为这是pdfwriter.getimportedpage唯一尊重的框。

从给定的PDFReader导入页面之前,请使用以下方法裁剪:

static void cropPdf(PdfReader reader) throws IOException
{
    int n = reader.getNumberOfPages();
    for (int i = 1; i <= n; i++)
    {
        PdfReaderContentParser parser = new PdfReaderContentParser(reader);
        MarginFinder finder = parser.processContent(i, new MarginFinder());
        Rectangle rect = new Rectangle(finder.getLlx(), finder.getLly(), finder.getUrx(), finder.getUry());

        PdfDictionary page = reader.getPageN(i);
        page.put(PdfName.MEDIABOX, new PdfArray(new float[]{rect.getLeft(), rect.getBottom(), rect.getRight(), rect.getTop()}));
    }
}
PdfReader readerText = new PdfReader(docText);
cropPdf(readerText);
PdfReader readerGraphics = new PdfReader(docGraphics);
cropPdf(readerGraphics);
try (   FileOutputStream fos = new FileOutputStream(new File(RESULT_FOLDER, "importPages.pdf")))
{
    Document document = new Document();
    PdfWriter writer = PdfWriter.getInstance(document, fos);
    document.open();
    document.add(new Paragraph("Let's import 'textOnly.pdf'", new Font(FontFamily.HELVETICA, 12, Font.BOLD)));
    document.add(Image.getInstance(writer.getImportedPage(readerText, 1)));
    document.add(new Paragraph("and now 'graphicsOnly.pdf'", new Font(FontFamily.HELVETICA, 12, Font.BOLD)));
    document.add(Image.getInstance(writer.getImportedPage(readerGraphics, 1)));
    document.add(new Paragraph("That's all, folks!", new Font(FontFamily.HELVETICA, 12, Font.BOLD)));

    document.close();
}
finally
{
    readerText.close();
    readerGraphics.close();
}

DocGraphics文档中的页面

转换为一个新的文档,文档之前、之间和之后都有一些文本。结果是:

正如您所看到的,源样式被保留,但周围的空闲空间被丢弃。

 类似资料:
  • 问题内容: 我需要使用iText从pdf文件中提取文本。 问题是:一些pdf文件包含2列,当我提取文本时,我得到一个文本文件,其中的列作为结果合并(即同一行中两列的文本) 这是代码: 你能帮我完成这个任务吗? 问题答案: 我是iText文本提取子系统的作者。您需要做的是开发自己的文本提取策略(如果您看一下如何实现的话,就会发现您可以提供可插拔的策略)。 您将如何确定列的开始和停止位置完全取决于您-

  • 我正在使用Rest-Assured和GSON进行自动化测试,并且需要验证POST请求响应中返回的PDF文件的内容。文件的内容各不相同,可以包含任何内容,从文本到文本和表格,或者文本和表格和图形。就字形内容而言,每个页面都可能不同,而且很可能会不同。我只关心pdf页面上的所有文本——无论是纯文本,还是表格中的文本,或者是与图像相关的文本(或者是图像中的文本)。由于请求返回的所有pdf都是不同的,我无

  • 下面是我调用iText方法的java代码: 有人知道为什么当我把PDF放平时,文本会移动吗?我怎样才能避免这种情况呢? 我allready尝试了iText的不同版本。从版本4.x到5.x。不同之处出现在所有版本中。

  • 我可以修改现有PDF的字体吗。我有一些类型3(自定义)字体没有任何字体描述符。我想把它们换成一些有意义的字体。如何使用Itext或PDFBox执行此操作?

  • 问题内容: 我使用itext将pdf转换为文本文件,它实际上工作良好,但是对于某些词它可以完成以下操作:例如,在pdf中,有诸如“ present the main idea”之类的短语,但是itext创建了诸如“ presentthemainideas”之类的输出。无论如何,有没有纠正这种行为? 问题答案: 缺少空格字符的原因是,您在渲染的PDF中看到的空格不一定与PDF页面内容描述中的空格相对

  • 问题内容: 首先,我不是Java开发人员:(我只需要一个小程序,它将从现有pdf文件中按字段名称输出到我的字段坐标,当我从命令行调用类时输入该字段的坐标,就像这样: 我在服务器上使用itext。现在,我正在尝试运行简单的代码: 但是我有一个错误:“类型不匹配:无法从列表转换为float []”。当我更换 与 我得到了结果“ [com.itextpdf.text.pdf.AcroFields$Fie