הפורום נסגר!

במקומו נפתח פורום חדש, טוב יותר בהרבה מובנים. >>>>
אתם מוזמנים להצטרף אליו, בואו!

ההצטרפות לפורום התכנות החדש כרוכה בתשלום חודשי סמלי.

C#: שתילת טקסט בתוך קובץ PDF קיים בעברית, כולל יישור לימין

שיתוף של ידע פרקטי, ספריות, קוד, ודוקמנטציה ברוחב לב החברים היקרים.

C#: שתילת טקסט בתוך קובץ PDF קיים בעברית, כולל יישור לימין

הודעהעל ידי avr416 » 17 פברואר 2017, 14:29

כידוע, ישנם כמה ספריות נפוצות ליצירת ועריכת קבצי PDF בדוטנט, ואחת מהם היא: iTextSharp.
אלא שכפי שהבנתי יש איתם בעיה מוכרת וידועה של תמיכה ב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


בהצלחה לכולם!!
אברהם
avr416
משתמש וותיק
 
הודעות: 853
הצטרף: 14 אפריל 2015, 15:53
שלח תודה: 1074 פעמים
קיבל תודה: 442 פעמים

חזור אל שיתופיה

מי מחובר

משתמשים הגולשים בפורום זה: all bots ו 0 אורחים

Fatal: ./cache/ is NOT writable.