ITextSharpを使用してHTMLドキュメントをPDFに変換しています。HTMLWorker.ParseToListを使用して、各アイテムを順番にループします。これは問題なく機能しますが、最初のページは後続のページとは異なる余白サイズを持つ必要があります。これを行うには、MyDocument.NewPage()を呼び出してMyDocument.SetMargins()を呼び出します。
ページの遷移を検出しようとすると、問題が発生します。
ループを使用してページ遷移を追跡し、NewPage()を呼び出して余白をリセットできますが、これは、新しいページに折り返す段落を実際に追加して、ページ全体を実質的に白のままにした場合にのみ発生します。 -スペース。
特定の段落オブジェクトを追加した場合にページが変更されるかどうかを事前に検出する方法が必要です。ColumnText.Go(true)を使用してシミュレートしようとしました(その結果がColumnText.NO_MORE_COLUMNの場合は、ページ分割にします)。残念ながら、これはせいぜい不安定に見え、ページ分割を検出する傾向があります。完全に間違った場所。
これが私の現在のコードです:
ColumnText simulation = new ColumnText(Writer.DirectContent);
simulation.SetSimpleColumn(Writer.PageSize);
bool FirstPage = true;
foreach (var item in ItemList)
{
var para = new Paragraph("", Normal);
para.AddAll(item.Chunks);
para.SpacingAfter = 10;
foreach (Chunk c in item.Chunks)
{
simulation.AddText(c);
}
if(FirstPage) {
int simresult = simulation.Go(true);
if(simresult == (int)ColumnText.NO_MORE_COLUMN)
{
textDocument.SetMargins(100,100,100,100);
textDocument.NewPage();
FirstPage = false;
}
}
textDocument.Add(para);
}
その結果、2ページ目の終わりまでページ分割が検出されません。これは良くありません。
それを機能させるために私が見つけた唯一の方法は、simulation.SetSimpleColumnに入る高さを半分にすることです。
それは機能しますが、理由はわかりません。正直なところ、それは良くありません。誰かが私に素晴らしい洞察を与えることができれば。
アレクシスのおかげで私はそれを解決しました。ITextSharpはJavaイベントモデルに完全に準拠しています。これは、WriterとDocumentで直接イベントを探していたので面倒です。まず、PdfPageEventHelperを無効にするクラスを作成する必要がありました。
internal class MainTextEventsHandler : PdfPageEventHelper
{
public override void OnStartPage(PdfWriter writer, Document document)
{
document.SetMargins(document.LeftMargin, document.LeftMargin, document.TopMargin, document.BottomMargin); //Mirror the horizontal margins
document.NewPage(); //do this otherwise the margins won't take
}
}
次に、WriterオブジェクトのPageEventプロパティを設定し、ループを変更してシミュレーションを削除しました。
Writer.PageEvent = new MainTextEventsHandler();
foreach (var item in ItemList)
{
var para = new Paragraph("", Normal);
para.AddAll(item.Chunks);
/* per-paragraph stuff here */
para.SpacingAfter = 10;
textDocument.Add(para);
}