C#: שתילת טקסט בתוך קובץ PDF קיים בעברית, כולל יישור לימין
פורסם: 17 פברואר 2017, 14:29
כידוע, ישנם כמה ספריות נפוצות ליצירת ועריכת קבצי PDF בדוטנט, ואחת מהם היא: iTextSharp.
אלא שכפי שהבנתי יש איתם בעיה מוכרת וידועה של תמיכה בRTL.
בד"כ ממליצים לעבוד עם אובייקט של טבלה, ולהגדיר את הטבלה מימין לשמאל וכך לעקוף את הבעיה, עיינו כאן בהרחבה.
כל זה טוב ויפה כשכותבים את הPDF מאפס, אולם כשרוצים לעשות מניפולציה על קובץ קיים, זה כבר יותר מסובך.
לאחר חיפושים נרחבים, כתבתי את הפונקציה הבא:
csharp code
קצת הרחבה למי שרוצה להבין מה אנו עושים פה:
הפונקציה מקבלת 3 פרמטרים: כתובת קובץ המקור, כתובת קובץ היעד (הקובץ שאנו רוצים לשמור), הטקסט שאנו רוצים להוסיף.
בשורה 16 אנו מגדירים את סוג הגופן שאנו רוצים להשתמש בו.
בשורה 18 את הגודל שלו, אפשר להוסיף שם גם הגדרת צבע אם רוצים.
בשורה 23 אנו רצים בלולאה על כל העמודים בקובץ ושותלים בכל עמוד ועמוד את הטקסט שאנו רוצים.
בשורה 27 אנו בודקים האם העמוד הוא לאורך או לרוחב (כדי שאם העמוד לרוחב - הטקסט יודפס בתחתית האמיתית שלו ולא בצד.
בשורה 29 אנו מגדירים את נקודת הX - דהיינו המיקום שבו יתווסף הטקטסט יחסית לרוחב המסך, בקוד זה מוגדר לאמצע רוחב העמוד, כך שהטקסט מופיע ממורכז.
בשורה 30 אנו מגדירים את נקודת הY - דהיינו המרחק של הטקסט מהשוליים התחתונים או העליונים (כדי שהטקסט יופיע למעלה צריך לקרוא לפונקציה GetTop ולתת לה את הערך שהוא המרחק מהקצה העליון).
אותו דבר אנו עושים בשורות 34-35 רק כלפי הצד. (במקרה שהעמוד לרוחב ולא לאורך).
בשורה 37 אנו שותלים את הטקסט שיצרנו בתוך התוכן הקיים.
stamper.GetOverContent(i) - מורה לטקסט לדרוס את הפיקסלים הקיימים בקובץ המקור, כך אנו מקבלים חתימה מעל גבי הקובץ. אפשר לשנות את זה, כך שהחתימה לא תדרוס את תוכן הקובץ, והקובץ יופיע אחריה (או לפניה, תלוי אם היא למעלה או למטה).
בשורה 39 אנו מוסיפים שתי מאפיינים שהם אלה שמגדירים את היישור לימין:
בהצלחה לכולם!!
אברהם
אלא שכפי שהבנתי יש איתם בעיה מוכרת וידועה של תמיכה בRTL.
בד"כ ממליצים לעבוד עם אובייקט של טבלה, ולהגדיר את הטבלה מימין לשמאל וכך לעקוף את הבעיה, עיינו כאן בהרחבה.
כל זה טוב ויפה כשכותבים את הPDF מאפס, אולם כשרוצים לעשות מניפולציה על קובץ קיים, זה כבר יותר מסובך.
לאחר חיפושים נרחבים, כתבתי את הפונקציה הבא:
csharp code
sing System;
using iTextSharp.text.pdf;
using System.IO;
using iTextSharp.text;
namespace CreatePDF
{
public class PdfHelperExternal
{
//http://stackoverflow.com/questions/24678640/itext-pdfdocument-page-size-inaccurate?answertab=votes#tab-top
public static bool AddHeaderToPdfFile(String srcPath, String destPath,string text)
{
PdfReader reader = new PdfReader(srcPath);
PdfStamper stamper = new PdfStamper(reader, new FileStream(destPath, FileMode.Create, FileAccess.Write));
//כאן ניתן להגדיר כל פונט שרוצים
var baseFont = BaseFont.CreateFont(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts),
"gisha.ttf"), BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
var font = new iTextSharp.text.Font(baseFont, 14, iTextSharp.text.Font.BOLD);
//הטקסט שאנו רוצים לשתול
Phrase footer = new Phrase(text, font);
for (int i = 1; i <= reader.NumberOfPages; i++)
{
float x, y;
//הגדרת המיקום בדף
if (reader.GetPageRotation(i) % 180 == 0)
{
x = reader.GetPageSize(i).Width / 2;
y = reader.GetPageSize(i).GetBottom(20);
}
else
{
x = reader.GetPageSize(i).Height / 2;
y = reader.GetPageSize(i).Right= 20;
}
ColumnText.ShowTextAligned(
stamper.GetOverContent(i), Element.ALIGN_CENTER,
footer, x, y,0, PdfWriter.RUN_DIRECTION_LTR, ColumnText.AR_LIG);
}
stamper.Close();
reader.Close();
return true;
}
}
}
קצת הרחבה למי שרוצה להבין מה אנו עושים פה:
הפונקציה מקבלת 3 פרמטרים: כתובת קובץ המקור, כתובת קובץ היעד (הקובץ שאנו רוצים לשמור), הטקסט שאנו רוצים להוסיף.
בשורה 16 אנו מגדירים את סוג הגופן שאנו רוצים להשתמש בו.
בשורה 18 את הגודל שלו, אפשר להוסיף שם גם הגדרת צבע אם רוצים.
בשורה 23 אנו רצים בלולאה על כל העמודים בקובץ ושותלים בכל עמוד ועמוד את הטקסט שאנו רוצים.
בשורה 27 אנו בודקים האם העמוד הוא לאורך או לרוחב (כדי שאם העמוד לרוחב - הטקסט יודפס בתחתית האמיתית שלו ולא בצד.
בשורה 29 אנו מגדירים את נקודת הX - דהיינו המיקום שבו יתווסף הטקטסט יחסית לרוחב המסך, בקוד זה מוגדר לאמצע רוחב העמוד, כך שהטקסט מופיע ממורכז.
בשורה 30 אנו מגדירים את נקודת הY - דהיינו המרחק של הטקסט מהשוליים התחתונים או העליונים (כדי שהטקסט יופיע למעלה צריך לקרוא לפונקציה GetTop ולתת לה את הערך שהוא המרחק מהקצה העליון).
אותו דבר אנו עושים בשורות 34-35 רק כלפי הצד. (במקרה שהעמוד לרוחב ולא לאורך).
בשורה 37 אנו שותלים את הטקסט שיצרנו בתוך התוכן הקיים.
stamper.GetOverContent(i) - מורה לטקסט לדרוס את הפיקסלים הקיימים בקובץ המקור, כך אנו מקבלים חתימה מעל גבי הקובץ. אפשר לשנות את זה, כך שהחתימה לא תדרוס את תוכן הקובץ, והקובץ יופיע אחריה (או לפניה, תלוי אם היא למעלה או למטה).
בשורה 39 אנו מוסיפים שתי מאפיינים שהם אלה שמגדירים את היישור לימין:
PdfWriter.RUN_DIRECTION_LTR, ColumnText.AR_LIG
בהצלחה לכולם!!
אברהם