私はしばらくの間、この問題を解決しようとしていませんでした。 iTextSharpに改行を入れようとしているテキストがあります。成功せずに_\n
_エスケープ文字、_Environment.NewLine
_、およびdocument.Add(new Phrase(Environment.NewLine))
を使用しようとしました。これを行う方法はありますか?ここに私がやろうとしているコードの一部があります(_//Doesn't work
_でコメントされている行に注意してください):
_//Open the reader
PdfReader reader = new PdfReader(oldFile);
Rectangle size = reader.GetPageSizeWithRotation(1);
Document document = new Document(size);
// open the writer
FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write);
PdfWriter writer = PdfWriter.GetInstance(document, fs);
document.Open();
//Configure the content
PdfContentByte cb = writer.DirectContent;
// select the font properties
BaseFont bf = BaseFont.CreateFont("c:\\windows\\fonts\\calibri.ttf", BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.SetColorFill(BaseColor.BLACK);
cb.SetFontAndSize(bf, 10);
//Write the text here
cb.BeginText();
text = "F\n";//Doesn’t work
document.Add(new Phrase(Environment.NewLine));//Doesn’t work
text += "o\n";
text += Environment.NewLine;//Doesn’t work
text += "o\n";
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, 85, 311, 0);
cb.EndText();
//Create the new page
PdfImportedPage page = writer.GetImportedPage(reader, 1);
cb.AddTemplate(page, 0, 0);
//Close all streams
document.Close();
fs.Close();
writer.Close();
reader.Close();
_
助言がありますか?
1つ編集:
それでもdocument.Add(new Paragraph("\n"));
で動作しません。私は間違っていましたか?
_cb.BeginText();
text = "F";
document.Add(new Paragraph("\n"));
text += "o";
document.Add(new Paragraph("\n"));
text += "o";
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, 85, 311, 0);
cb.EndText();
_
ITextSharpでテキストを操作するには、Paragraph
やPhrase
などの抽象化を使用する方法と、PdfContentByte
を使用してコマンドを手動で実行する方法の2つの主な方法があります。抽象化は、マージン、改行、間隔などを処理しますが、手動ルートはすべてあなた次第です。あなたが実際にやっている2つを実際に混ぜることはできません。きめ細かな制御が特に必要でない限り、手動ルートではなく抽象化を使用することを強くお勧めします。以下は両方を表示するサンプルです。
ただし、具体的に質問に答えるために、raw PDFコマンド(使用している))は特定のx,y
左から右への座標であり、「戻り」または「改行」の概念をサポートしていません。これを行うには、現在のテキストカーソルを手動で新しい行に移動する必要があります。そのサンプルについては、以下のコードを参照してください。
string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");
using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
using (Document doc = new Document(PageSize.LETTER)) {
using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
doc.Open();
//This creates two lines of text using the iTextSharp abstractions
doc.Add(new Paragraph("This is Paragraph 1"));
doc.Add(new Paragraph("This is Paragraph 2"));
//This does the same as above but line spacing needs to be calculated manually
PdfContentByte cb = writer.DirectContent;
cb.SaveState();
cb.SetColorFill(BaseColor.BLACK);
cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12f);
cb.BeginText();
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "This is cb1", 20, 311, 0);
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "This is cb2", 20, 291, 0);//Just guessing that line two should be 20px down, will actually depend on the font
cb.EndText();
cb.RestoreState();
doc.Close();
}
}
}
次のようなものを試してください:
document.Add(new Chunk("\n"));
document.Add(new Paragraph(" "));
はうまく機能します。 Paragraph
ステートメントは自動的に改行を追加することを忘れないでください。あなたがしなければならないのは、レンダリングするものを与えることです。この場合、スペースで十分です。
document.Add(new Paragraph("\n"));
編集:
cb.BeginText();
string text = "";
text = "F\n";
text += "o\n";
text += "o";
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, 85, 311, 0);
cb.EndText();
//Create the new page
PdfImportedPage page = writer.GetImportedPage(reader, 1);
cb.AddTemplate(page, 0, 0);
Paragraph p = new Paragraph(text);
document.Add(p);
//Close all streams
document.Close();
fs.Close();
writer.Close();
reader.Close();
間隔属性を追加すると、ブレークの高さを正確に設定できます...
var spacerParagraph = new Paragraph();
spacerParagraph.SpacingBefore = 4f;
spacerParagraph.SpacingAfter = 0f;
document.Add(spacerParagraph);
私はこのツールを試していますが、新しい行を追加するために '\ r\n'を追加しましたが、うまくいきました。以下のように。
String content01 = "Nulla condimentum dui lobortis risus viverra, eu pellentesque sem blandit.\r\nUt congue turpis quis sapien mollis, vitae rutrum mi consectetur. Integer maximus nisl sed tellus pharetra pharetra.";
Phrase contentPhrase = new Phrase(content01);
Paragraph contentPr = new Paragraph();
contentPr.Add(contentPhrase);
次に、Paragraph contentPtrをDocumentインスタンスに追加しました。
私にとっては、このように機能しました:
document.Add(new Chunk("\n"));
うまくいきましたが、スペースは予想以上でした。だから私はこれで行きました:
document.Add(new Paragraph(" "));
その結果、コンポーネント間にきちんとした規則正しいスペースができました。
これは少し古いことは知っていますが、まだ別の方法があります。これは私が使用したレポートの一部です。
var contents = new Paragraph();
contents.Alignment = Element.ALIGN_CENTER;
contents.Add(new Chunk(string.Format("{0} {1}\n", emp.FirstName, emp.LastName), new Font(baseFont, 11f, Font.BOLD)));
contents.Add(new Chunk(string.Format("Dept: {0}\n", emp.Departments.Title), new Font(baseFont, 9f)));
contents.Add(new Chunk(string.Format("Wk Ending: {0}\n", _date), new Font(baseFont, 9f)));
ご覧のとおり、チャンクを作成しました。これにより、「\ n」を使用して改行を実行できます。
これは私にとって完璧に機能します。
Dim chunkNewLine As Chunk = New Chunk(Chunk.NEWLINE)
Dim addressPhrase As New Phrase
addressPhrase.Add(chunkNewLine)