4

私はライブラリ iText 5.3.3 を使用していますが、どのコンプライアンス レベルを尊重する必要があるかを指定する必要があるクラス PdfAWriter で PDF を作成したくありません。

ドキュメントに PdfPTable を追加したくありませんが、「すべてのフォントを埋め込む必要があります。これは Helvetica ではありません」というエラーが発生するため、それを行うことができません。

この問題は、PDFAConformanceLevel で PDF を作成するときに使用するフォントを埋め込む必要があるためだと思います。それは私がやったことですが、場合によってはデフォルトのフォントが使用されているようです:Helvetica、そしてこのデフォルトのフォントは埋め込まれておらず、埋め込むこともできません! これは、新しい行、空の行、新しいページを追加するとき、または PdfPTable などの要素を操作するときに発生します。

PdfPTable のような要素を扱うときに使用するデフォルトのフォントを定義する方法に違いないと思います。誰かが新しい Chunk コンストラクターを定義することでこれを行うことができると聞きましたが、方法がわかりません....誰かアイデアがありますか?

ここで私のコードを見つけることができます...目的のために単純化しました:

このコードで 2 つの埋め込みフォントを定義します。

FontFactory.register("c:/NewYorker.ttf");
baseFont = (FontFactory.getFont("new yorker","UTF-8",BaseFont.EMBEDDED)).getBaseFont();
baseFont.setSubset(true);
BOLD = new Font(timesbd, 12);
NORMAL = new Font(times, 12);

そして、これらのフォントを使用して、3 つのセルに 3 つの段落を追加して、1 つのテーブルに配置します。

Document document = new Document();
PdfAWriter writer = PdfAWriter.getInstance(document, new FileOutputStream(filename), PdfAConformanceLevel.PDF_A_1B);
document.open();

float[] columnWidths = { 3.5f, 4.5f, 2.8f };
PdfPTable table = new PdfPTable(columnWidths);

PdfPCell defaultCell = table.getDefaultCell();
defaultCell.setPhrase(new Phrase("",NORMAL)); 

table.setWidthPercentage(90);
table.setHorizontalAlignment(Element.ALIGN_RIGHT);

PdfPCell cell1 = new PdfPCell(new Phrase("test 1",BOLD));
PdfPCell cell2 = new PdfPCell(new Phrase("test 2",NORMAL));
PdfPCell cell3 = new PdfPCell(new Phrase("test 3",NORMAL));

cell1.setBorder(0);
cell2.setBorder(0);
cell3.setBorder(0);

cell1.setIndent(27);
cell2.setIndent(27);
cell3.setIndent(27);

cell1.setLeading(4.5f, 1);
cell2.setLeading(4.5f, 1);
cell3.setLeading(4.5f, 1);

table.addCell(cell1);
table.addCell(cell2);
table.addCell(cell3);

document.add(table);

document.close();

そして、コードを実行すると、このスタックがあります:

Exception in thread "main" com.itextpdf.text.DocumentException: com.itextpdf.text.pdf.PdfAConformanceException: All the fonts must be embedded. This one isn't: Helvetica
at com.itextpdf.text.pdf.PdfDocument.add(PdfDocument.java:708)
at com.itextpdf.text.Document.add(Document.java:260)
at test.MainClass.createPdfA(MainClass.java:163)
at test.MainClass.main(MainClass.java:68)
4

1 に答える 1

4

コードにはさまざまなエラーがあり、フォントは最大の問題ではありません。

コードを可能な限りコピーして貼り付けました:http://itextsupport.com/files/stackoverflow/PdfATest.java

  • PC に NewYorker.ttf がないため、フォントを変更する必要がありました。
  • 完全なフォントは埋め込んでいません。それはやり過ぎのように思えました。
  • XMP データを作成する行を追加しました (これは PDF/A では必須です)。
  • カラー プロファイルを追加しました (これも必須です。私はsRGBを選択しました)。

コードを実行しましたが、例外はスローされませんでした。自分で結果を確認できます: http://itextsupport.com/files/stackoverflow/pdfa.pdf

もちろん、これが PDF/A1b であることを示す青いバーが表示された場合は、Adobe Reader を信用しないでください。以下の画像のように、プリフライト ツールで適合性を確認する必要があります。 ここに画像の説明を入力

私の推測:

  • 「new yorker」がフォントの実際の PostScript 名であるというあなたの仮定は間違っているかもしれません。
  • エンコーディングとして「UTF-8」を使用しているのはなぜですか。ドキュメントには、Unicode を使用する場合は Identity-H を使用する必要があることが明確に記載されています。

問題を再現できないため、私のコードを実行してみることをお勧めします。

于 2012-11-23T12:36:03.310 に答える