2009-07-24 2 views
1

생성 된 XML을 데이터베이스에서 변환하기 위해 XSL (XML-FO)을 사용하여 PDF를 생성하려고합니다.C#에서 형식화 된 문자열의 너비와 높이 계산

이 문서의 페이징 측면에서 복잡한 규칙 때문에 계산은 XSL에서 사용되는 XML을 생성 할 때 페이지 나누기를 결정할 때 수행됩니다. 나는이 계산으로 일관성없는 결과를 얻고 있음을 발견했다. 예를 들어, 높이의 측면에서 필요한 인쇄 영역은 72 인치 (72 포인트/인치) = 648 포인트를 곱하여 포인트로 변환하는 9 인치입니다.

그래서 모든 줄에서 MeasureString을 사용하여 줄의 높이를 구한 다음 줄을 인쇄 할 여유 공간이 남아 있는지 648에서 뺍니다. 그러나 페이지 나누기가 결정될 때마다 맨 아래에 큰 공백이 남습니다. 648pt 변환이 잘못된 것처럼 보입니다. 이제 MeasureString 메서드에서 반환되는 높이가 잘못되었을 수도 있습니다.

나는 긴 게시물에 대해 사과하지만 잘못된 제안을하는 것에 대한 의견이나 제안을 보내 주시면 감사하겠습니다.

고맙습니다.

답변

2

가장 큰 문제는 GDI 메서드를 사용하여 PDF에 표시 될 문자열을 측정한다는 것입니다. 그것은 단지 정확하지 않을 것입니다. (글꼴을 동일하게 만들었더라도 기억하는 것과는 다른 렌더링 기술을 사용합니다.)

그래서 다른 계산 방법을 시도해야합니다. 한 가지 간단한 첫 단계는 한 줄당 문자 수를 추산 한 다음 PDF에서 각 줄의 높이를 계산하는 것입니다. 그런 다음 그 번호를 사용하십시오. 그것이 가까워지면 특정 문자에주의를 기울여 평가 기법을 향상시킬 수 있습니다. (당신은 아마도 커닝을 계산하는 수준으로 올라 가기를 원하지 않을 것입니다.)

또 다른 기술은 제가 지난 프로젝트에서 작업 한 것을 할 수 있습니다. iTextSharp를 사용하여 페이지에 대각선으로 속이 빈 텍스트를 추가해야했습니다 (일종의 워터 마크). 텍스트가 알려지지 않았기 때문에 원래 글꼴 크기를 추측했습니다. 그런 다음 코드는 렌더링 된 텍스트의 크기를 측정하고 텍스트를 잘라 내지 않고 페이지를 채우기에 적합한 크기가 될 때까지 위 또는 아래로 조정하는 루프로 이동했습니다. (이 모든 추측과 측정은 iTextSharp로 수행되었습니다.)

+0

미안하지만, 너희들에게 돌아 가기까지는 너무 오래 걸렸다. 추정 기법을 사용해야했습니다. 나는 가까워지고 있다고 생각한다. 감사! – Jaime

0

System.Drawing.Graphics 클래스에서 MeasureString 메서드를 사용한다고 가정합니다. 포인트를 측정하려면 PageUnit 속성을 GraphicsUnit.Point으로 설정해야합니다.

XSL-FO는 GDI +와 같은 방식으로 렌더링하지 않을 가능성이 큽니다. 특히 텍스트를 줄 바꿈하는 알고리즘이 다릅니다.

그러나 PageUnit이 정확하고 랩핑 된 텍스트가 포함되지 않은 간단한 레이아웃이 있다고 가정하면 XSL-FO에서 생성 된 PDF의 크기를 예측하는 동안 명백한 것을 간과 할 수 있습니다. 아마도 1 인치 간격으로 페이지 크기를 1에서 9 인치로 변경할 수 있습니다. 그런 다음 눈금자를 사용하여 초과 공백을 측정하고 페이지 크기와 초과 공백 사이의 관계를 결정할 수 있습니다. 그런 다음 텍스트 크기에 대한 잘못된 가정을 파악하기 위해 코드를 다시 방문해야합니다.

+0

답장을 보내 주셔서 감사합니다 마틴! 나는 그 의견을 고맙게 생각한다. – Jaime

0

저는 몇 년 전에 아주 비슷한 문제가있었습니다.

내 자신의 프로젝트에서 발견 한 것은 P/Invoke를 통한 이전 Win32 gdi 함수 (http://msdn.microsoft.com/en-us/library/dd144821(VS.85).aspx)를 사용하여 훨씬 더 나은 결과를 얻었습니다.GDI + MeasureString과 다른 결과가 반환됩니다. 그들은 PDF에서 보았던 것과 훨씬 더 일치했습니다.

관련 문제