使用 PDDocument 在 java 中创建 PDF 文件导致 PDF 文件损坏

Creating PDF file in java using PDDocument results in corrupted PDF files

我正在尝试使用 PDDocument 在 Java 中创建临时 PDF 文件。我正在使用以下方法创建临时 PDF 文件。

/* Create a temporary PDF file.*/
private File createPdf(String fileName) throws IOException {
    final PDDocument document = new PDDocument();
    final File file = File.createTempFile(fileName, ".pdf");
    //write it
    BufferedWriter bw = new BufferedWriter(new FileWriter(file));
    bw.write("This is the temporary pdf file content");
    bw.close();
    document.save(file);        
    document.close();
    return file;
}

这是测试。

@Test
public void testCreateAndMergePdfs() throws IOException {
    Collection<File> pdfs = new ArrayList<>(Arrays.asList(createPdf("File1"), createPdf("File2")));
    assertFalse(CollectionUtils.isEmpty(pdfs));
    PdfPrintPojo pdfPrintPojo = new PdfPrintPojo(pdfs);
    File mergedFile = service.createAndMergePDFs(pdfPrintPojo, "Merged");
    assertNotNull(mergedFile);
    List<File> list = new ArrayList<>(pdfs);
    File file1 = list.get(0);
    File file2 = list.get(1);
    assertTrue(FileUtils.contentEquals(file1, file2));
}

我在这里要做的是创建并合并两个 PDF 文件。当我 运行 测试时,它会在 temp 文件夹中创建两个 PDF 文件,例如 \AppData\Local\Temp\File16375814641476797612.pdf\AppData\Local\Temp\File24102718409195239661.pdf 以及 [=21 处的合并文件=].但是测试失败了 assertTrue(FileUtils.contentEquals(file1, file2)); 当我尝试打开 temp 文件夹中的 PDF 文件时,它说 PDF 已损坏。另外,我不知道为什么文件没有保存为 File1File2。谁能帮我这个?

你比较文件内容的方式有点不同,你可以试试下面的方法,

@Test
public void testCreateAndMergePdfs() {
    Assert.assertEquals(FileUtils.readLines(file1), FileUtils.readLines(file2));
} 

或者你可以试试

    byte[] file1Bytes = Files.readAllBytes(Paths.get("Path to File 1"));
    byte[] file2Bytes = Files.readAllBytes(Paths.get("Path to File 2"));

    String file1 = new String(file1Bytes, StandardCharsets.UTF_8);
    String file2 = new String(file2Bytes, StandardCharsets.UTF_8);

    assertEquals("The content in the strings should match", file1, file2);

或者

    File file1 = new File(file1);
    File file2 = new File(file2);
    assertThat(file1).hasSameContentAs(file2);

使用 Apache PDFBox 教程,我成功创建了一个可用的 PDF 文件。方法修改如下

/* Create a temporary PDF file.*/
private File createPdf(String fileName) throws IOException {
    // Create a document and add a page to it
    final PDDocument document = new PDDocument();
    PDPage page = new PDPage();
    document.addPage(page);

    // Create a new font object selecting one of the PDF base fonts
    PDFont font = PDType1Font.HELVETICA_BOLD;

    // Start a new content stream which will "hold" the to be created content
    PDPageContentStream contentStream = new PDPageContentStream(document, page);

    // Define a text content stream using the selected font, moving the cursor and drawing the text "Hello World"
    contentStream.beginText();
    contentStream.setFont(font, 12);
    contentStream.newLineAtOffset(100, 700);
    contentStream.showText("Hello World");
    contentStream.endText();

    // Make sure that the content stream is closed:
    contentStream.close();

    // Save the results and ensure that the document is properly closed:
    File file = File.createTempFile(fileName, ".pdf");
    document.save(file);
    document.close();
    return file;
}

至于测试,我采用了使用 PDDocument 加载文件的方法,然后使用 PDFTextStripper 将数据提取为字符串,并对这些字符串使用断言。

 @Test
public void testCreateAndMergePdfs() throws IOException {
    Collection<File> pdfs = new ArrayList<>(Arrays.asList(createPdf("File1"), createPdf("File2")));
    assertFalse(CollectionUtils.isEmpty(pdfs));
    PdfPrintPojo pdfPrintPojo = new PdfPrintPojo(pdfs);
    File mergedFile = service.createAndMergePDFs(pdfPrintPojo, "Merged");
    assertNotNull(mergedFile);
    List<File> list = new ArrayList<>(pdfs);

    /* Load the PDF files and extract data as String. */
    PDDocument document1 = PDDocument.load(list.get(0));
    PDDocument document2 = PDDocument.load(list.get(1));
    PDDocument merged = PDDocument.load(mergedFile);

    PDFTextStripper stripper = new PDFTextStripper();
    String file1Data = stripper.getText(document1);
    String file2Data = stripper.getText(document2);
    String mergedData = stripper.getText(merged);

    /* Assert that data from file 1 and 2 are equal with each other and merged file. */
    assertEquals(file1Data, file2Data);
    assertEquals(file1Data + file2Data, mergedData);
}