0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

外字をPDFに(1)

Posted at

背景

お客様さんはPDF出力時、'おかしい'文字を出力したい

調査

外字ていうのは、自分定義したものです。unicodeのprivate use areaで定義される文字です。
U+E000–U+F8FFまでです。

外字確認

外字の確認は、fontforageで確認できます。
.ttfファイルに転換して、コードの中で、Unicodeで判断して、外字かどうかを確認できます。
外字の場合は、定義された.ttfフォントを使って、PDFに正しくプリントできます。

Java Code Sample(chatgpt ありがとう!)

    @Override
    public void run(ApplicationArguments args) throws Exception {
    try {
            // Read the file and save its content to the database
            String filePath = ("xxxx.外字ファイル");
            saveGaijiTextFromFile(filePath);

            // Fetch the Gaiji records from the database
            List<GaijiTest> gaijiList = gaijiTestService.getAllGaijiTestRecords();

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

            // Load fonts
            File meiryoFontFile = new File("MEIRYO.ttf");
            PDFont meiryoFont = PDType0Font.load(document, meiryoFontFile);

            File gaijiFontFile = new File("外字.ttf");
            PDFont gaijiFont = PDType0Font.load(document, gaijiFontFile);

            PDPageContentStream contentStream = new PDPageContentStream(document, page);
            contentStream.beginText();
            contentStream.newLineAtOffset(50, 700);

            // Iterate through the GaijiTest records and add them to the PDF
            for (GaijiTest gaijiTest : gaijiList) {

                // Write normal text using Meiryo font
                contentStream.setFont(meiryoFont, 12);
                contentStream.showText(String.valueOf(gaijiTest.getId()));
                contentStream.showText(": ");
                contentStream.showText(gaijiTest.getNormalText());

                // Write Gaiji text using Gaiji font, or handle with font switching logic
                if (gaijiTest.getId() != 15) {
                    contentStream.setFont(gaijiFont, 12);
                    contentStream.showText(gaijiTest.getGaijiText());
                } else {
                  //外字と他の文字が混在する場合
                    String gaijiText = gaijiTest.getGaijiText();
                    contentStream.newLineAtOffset(0, -15);
                    // Check if the character is a Gaiji character 
                    for (char ch : gaijiText.toCharArray()) {
                        PDFont fontToUse = isGaiji(ch) ? gaijiFont : meiryoFont;
                        contentStream.setFont(fontToUse, 12);
                        contentStream.showText(String.valueOf(ch));
                    }
                }
            }
            contentStream.endText();
            contentStream.close();

            // Save the document
            document.save("output_with_gaiji.pdf");
            document.close();

            System.out.println("PDF creation complete: output_with_gaiji.pdf");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Check if the character is Gaiji (special character)
    private boolean isGaiji(char ch) {
        return (ch >= '\uE000' && ch <= '\uF8FF'); // Unicode range for Gaiji characters
    }

    // Method to read the file and save its content into the DB
    public String readFile(String filePath) {
        StringBuilder gaijiText = new StringBuilder();

        try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                gaijiText.append(line).append("\n");  // Append each line with a newline character
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return gaijiText.toString();  // Return the full content of the file
    }

    // Method to read the file and save gaijiText to DB using GaijiTestService
    public void saveGaijiTextFromFile(String filePath) {
        // Read the file and get the content as a string
        String gaijiText = readFile(filePath);

        // Save the gaijiText into the database using the GaijiTestService
        GaijiTest savedGaijiTest = gaijiTestService.saveGaijiText(gaijiText);
        System.out.println("Saved GaijiTest with ID: " + savedGaijiTest.getId());
    }
}

なんかいろがついていない...

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?